LoginSignup
12
11

More than 5 years have passed since last update.

WebViewから外部ブラウザを起動する時のActivityNotFoundException

Posted at

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しておきましょう。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11