LoginSignup
8

More than 3 years have passed since last update.

Android 6以下ではDeprecatedなWebViewClient#shouldOverrideUrlLoadingのオーバーライドが必要

Posted at

あたりまえの話かもしれないけどメモ。

前提

Androidのwebviewで踏んだAタグのリンクへのフック処理
の記事のように、WebView内で特定のURLをロードしようとした際に独自処理(今回はネイティブ側での画面遷移)を行う実装をしていた。

起きたこと

Android 6以前では、上述の独自処理が動作していなかった。

ソースコード(改善前)

以下のような実装をしていた。

BadActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        val webView = findViewById<WebView>(R.id.web_view)

        webView.webViewClient = object : WebViewClient() {

            override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                if (request?.url.toString == "callback://doSomething") {
                    // 独自処理
                    val intent = Intent(this@BadActivity, AnotherActivity::class.java)
                    startActivity(intent)
                    return true
                }
                return false
            }
        }
        // ...
    }

原因

WebViewClientの

public boolean shouldOverrideUrlLoading(WebView view, String url)

は、API Level 24でDeprecatedとなっており、新しく

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

が追加されている。

今回は新しい方の shouldOverrideUrlLoading メソッドしかoverrideしておらず、API Level 24(= Android 7)未満ではこれが動いていなかった。

ソースコード(改善後)

以下のような実装に修正し、Android 6以前でも独自処理が正常に動作した。

    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        val webView = findViewById<WebView>(R.id.web_view)

        webView.webViewClient = object : WebViewClient() {

            @TargetApi(Build.VERSION_CODES.N)
            override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                return handleOverrideUrlLoading(view, request?.url)
            }

            @SuppressWarnings("deprecation")
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                return handleOverrideUrlLoading(view, Uri.parse(url))
            }

            override fun handleOverrideUrlLoading(view: WebView?, uri: Uri?): Boolean {
                if (uri?.toString == "callback://doSomething") {
                    // 独自処理
                    val intent = Intent(this@BadActivity, AnotherActivity::class.java)
                    startActivity(intent)
                    return true
                }
                return false
            }
        }
        // ...
    }

参考URL

反省点

  • deprecatedだからといって、単純に新しい方のメソッドに置き換えてしまったのがまずかった
    • 公式ドキュメントの、 Added in API level 24 の記述をちゃんと見る
  • そもそも、アプリの対象バージョンとしていたAndroid 6で動作確認を全くしていなかった
    • 納期や端末の調達の問題はあったが、最低限動作確認をする必要がある(当たり前)

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
8