WebView内リンクを外部ブラウザで開く
WebViewを使った画面で、ページ内のリンクの一部をタップすると外部ブラウザで開くようにしたい!という要望はままあります。
そういう時は以下のような実装になるかと思います。
webView.setWebViewClient(new WebViewClient() {
// Android 7以降
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (特定のurl) {
// ブラウザ起動
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
else {
return false;
}
}
});
ActivityNotFoundException
しかし実はここで、あるパターンの場合にクラッシュします。
それは有効なブラウザアプリが無い場合です。
Androidには標準でブラウザが入っています(最近だとChrome?)が、それは設定アプリから無効にできます。
そうすると上記コードのstartActivity()
でandroid.content.ActivityNotFoundException
がthrowされてアプリが強制終了してしまいます。
「ブラウザ無効にするユーザとか普通いるのか?」という疑問は当然あるかとは思いますが、テストで指摘されることもありますし、実際にクラッシュさせられる手順が存在しているので対応しておきましょう。
とりあえず対応したコード
webView.setWebViewClient(new WebViewClient() {
// Android 7以降
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (特定のurl) {
try {
// ブラウザ起動
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
}
catch (ActivityNotFoundException e) {
// ブラウザアプリが有効でない場合はここに入る
// 必要ならエラー表示とかする
e.printStackTrace();
}
return true;
}
else {
return false;
}
}
});
結論
外部ブラウザが無効になっているとActivityNotFoundExceptionが投げられるのでcatchしておきましょう。