当webView中加载的某些页面需要跳转第三方app时,我们可以直接复写shouldOverrideUrlLoading(),在其中通过隐式Intent来进行跳转。
需要注意的是当设备上没有目标Activity时,直接startActivity会抛出ActivityNotFindException,所以我们在跳转前要使用resolveActivity()来判断当前设备内是否有目标Activity。
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
val intent = Intent.parseUri(request.url.toString(), Intent.URI_INTENT_SCHEME)
return if (intent.resolveActivity(view.context.packageManager) != null) {
view.context.startActivity(intent)
true
} else {
false
}
}
另外,在Android 11及以上版本,Google修改了查询设备上其他已安装应用的权限,我们需要在manifast中做一些声明才能查询。否则resolveActivity()只会返回null。详情可参考官方文档 Android 11 中的软件包可见性
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
</intent>
</queries>
...
</manifest>
如有错误,欢迎指正。