あたりまえの話かもしれないけどメモ。
前提
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
- android - Is `shouldOverrideUrlLoading` really deprecated? What can I use instead? - Stack Overflow
- [WebViewClient#shouldOverrideUrlLoading] (https://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading(android.webkit.WebView,%20android.webkit.WebResourceRequest))
反省点
- deprecatedだからといって、単純に新しい方のメソッドに置き換えてしまったのがまずかった
- 公式ドキュメントの、
Added in API level 24
の記述をちゃんと見る
- 公式ドキュメントの、
- そもそも、アプリの対象バージョンとしていたAndroid 6で動作確認を全くしていなかった
- 納期や端末の調達の問題はあったが、最低限動作確認をする必要がある(当たり前)