質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

4032閲覧

webViewを使っているAndroidアプリから外部URLを押したときに外部ブラウザを立ち上げたい

kakeiteiya

総合スコア252

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/11/07 10:27

状況

Lamp環境で構築したwebサイトをwebViewを使ってAndroidアプリから見れるようにしています。

やりたいこと

あるボタンをタッチすると、外部URLに飛んで遷移するという機能があるのですが、
Androidアプリでこれをすると、アプリ内ブラウザのまま(アプリ内でそのまま)外部のページを開いてしまいます。

これをAndroidの標準ブラウザ、もしくはGoogle Choromeなどでもいいので外部ブラウザを立ち上げさせて、そちらで外部のページを閲覧させたいです

Androidアプリ内部ではなくWEB側(php、JavaScript、HTML)からのプログラムで実現させたいのですが、可能でしょうか、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Web側のみで対応するのは難しいように思えます。

もし、アプリ側を修正してもよいのであれば、shouldOverrideUrlLoading()を独自実装したWebViewClientWebViewに設定することにより、実現できます。

Java

1public class MyWebViewClient extends WebViewClient { 2 3 @Override 4 public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 5 Uri uri = request.getUri(); 6 String uriPath = uri.getPath(); 7 8 if(!uriPath.startsWith("《サイトのルートURL》")){ 9 Intent intent = new Intent(Intent.ACTION_VIEW, uri) 10 view.getContext().startActivity(intent); 11 return true; 12 } 13 14 return false; 15 } 16}

Java

1//WebViewを表示するアクティビティ内 2webView.setWebViewClient(new MyWebViewClient());

以下は、誤回答です。
Android版Chromeであれば、下記のように動作しますが、WebViewでは動作しないようです。動作させるには、前述のようにshouldOverrideUrlLoading()で制御する必要があります。

intentスキームのURLを用いれば実現できそうです。

次の形式のURLを、AndroidのWebViewで開こうとすると、VIEWアクションに対応するアプリが起動します。

intent://《遷移先URL(スキーム除く)》#Intent;scheme=《遷移先URLのスキーム》;action=android.intent.action.VIEW;end

例えば、この質問の場合、次のように指定すればOKです。

html

1<a href="intent://teratail.com/questions/156743#Intent;scheme=https;action=android.intent.action.VIEW;end">外部リンク</a>

ただ、<a>タグにURLを直接指定すると、通常のブラウザで遷移できなくなってしまいます。なので、通常のブラウザも考慮する場合、何らかの方法でAndroidアプリからのアクセスであるか判別し、遷移先を制御する必要があります。

Androidアプリからのアクセスであるか判別するには、JavaScriptでユーザーエージェントによる判別を行うがお手軽です。ただ、一部のAndroid端末で、内蔵ブラウザとWebViewのユーザーエージェントが同じであるため(参考2)、正確な判定ができません。

質問の前提を破ることになりますが、通常のブラウザも考慮する場合、AndroidアプリのWebViewのユーザーエージェントに独自の文字列を付与するなどの対応が必要かもしれません。


参考1:Stack Overflow - What is the intent to launch any website link in Google Chrome
参考2:au - Android(TM) 技術情報 - User Agent

投稿2018/11/07 12:22

編集2018/11/08 10:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/07 12:51

余談ですが、Androidアプリを修正しても良い場合、WebViewClientのshouldOverrideUrlLoading()を使うと簡単です。
kakeiteiya

2018/11/08 02:18

回答ありがとうございます・・! 実装してみたところ、Android内の標準ブラウザから外部リンクを押すと外部ブラウザの選択が表示され思い通りに動きました が、今回Lamp環境で構築したWEBサイトを表示させているスマホアプリからですと、外部ブラウザの選択が出ず、押しても無反応でした、、 少し調べている状況なのですが、Androidマニフェストなるファイルの修正が必要なのでしょうか。。 >質問の前提を破ることになりますが、通常のブラウザも考慮する場合 通常ブラウザは考慮していないです・・!基本的にはスマホアプリからのみです。(iOSは現在審査中なのでテストできていないですが)
退会済みユーザー

退会済みユーザー

2018/11/08 10:22

大変申し訳ございません。改めて調査したところ、前述の回答は誤っているようでした。参考1の質問で、回答者はWebViewでも他のブラウザでも動作すると述べていましたが、実際にはアプリ側でintentスキームのURLを制御しないと動作しないようです。 押しても無反応とのことですが、おそらくログにintentスキーマのURLが適切に制御できなかった旨のエラーまたは警告が表示されているのではないかと思います。 解決策についてですが、回答にも上げたように、Web側のみの修正では対応が難しいのではないかと思います。今回の問題に適用できないかもしれませんが、アプリ側での解決策を回答しましたので、よろしければ確認をお願いいたします。
kakeiteiya

2018/11/08 10:27

いえ!とても助かりました。回答ありがとうございます。 アプリ側での対応を参考にさせていただきます。
退会済みユーザー

退会済みユーザー

2018/11/08 10:28

本当にすみません... アプリ開発応援しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問