看着Hitesh Sahu和kam C答案,我得到了解决方案。
在API 21中,它引发了一个异常:“ android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?”。
正如diyism所注意到的,也可能找不到活动。因此,我处理了这些情况。
class MyWebViewClient : WebViewClient() {
@Suppress("DEPRECATION")
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (view != null && url != null) {
return resolveUri(view.context, Uri.parse(url))
}
return super.shouldOverrideUrlLoading(view, url)
}
@TargetApi(Build.VERSION_CODES.N)
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
val uri = request?.url
if (view != null && uri != null) {
return resolveUri(view.context, uri)
}
return super.shouldOverrideUrlLoading(view, request)
}
private fun resolveUri(context: Context, uri: Uri): Boolean {
val url = uri.toString()
URL_SCHEMES.forEach {
if (url.startsWith(it)) {
val intent = Intent(Intent.ACTION_VIEW).apply {
data = uri
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
}
return true
}
}
return false
}
companion object {
private val URL_SCHEMES = arrayOf(WebView.SCHEME_TEL,
WebView.SCHEME_MAILTO, WebView.SCHEME_GEO, "sms:", "smsto:", "mms:", "mmsto:")
}
}