Web側のみで対応するのは難しいように思えます。
もし、アプリ側を修正してもよいのであれば、shouldOverrideUrlLoading()
を独自実装したWebViewClient
をWebView
に設定することにより、実現できます。
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:51
2018/11/08 02:18
退会済みユーザー
2018/11/08 10:22
2018/11/08 10:27
退会済みユーザー
2018/11/08 10:28