Android WebView中DeepLink/Universal Link无法唤起目标应用求助
解决WebView中Universal Link/Deep Link无法唤起目标应用的问题
你的问题出在当前的shouldOverrideUrlLoading实现上——它强制所有URL都在WebView内部加载,完全没有区分普通链接和需要唤起外部应用的Universal Link/Deep Link。
修正思路是:先判断当前URL是否能被外部应用处理,能的话唤起目标应用,不能的话再在WebView内打开。以下是修正后的代码:
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { val uri = request.uri // 构造唤起外部应用的Intent val intent = Intent(Intent.ACTION_VIEW, uri) // 设置Flag,避免在Task栈中重复创建Activity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 检查设备是否有能处理该Intent的应用 val packageManager = view.context.packageManager val canHandle = intent.resolveActivity(packageManager) != null if (canHandle) { // 唤起外部应用 view.context.startActivity(intent) return true } else { // 没有对应应用,在WebView内加载 view.loadUrl(uri.toString()) return true } }
额外注意事项
- 确保目标应用已正确配置Universal Link/Deep Link的关联:
- 对于Deep Link,目标应用的
AndroidManifest.xml中需要配置对应的<intent-filter>,包含ACTION_VIEW、CATEGORY_BROWSABLE和CATEGORY_DEFAULT,并指定对应的scheme和host。 - 对于Universal Link,除了配置
<intent-filter>,还需要在目标应用的服务器上放置assetlinks.json文件,完成域名验证。
- 对于Deep Link,目标应用的
- 如果你的App需要优先处理某些特定域名的Universal Link,可以额外添加域名判断逻辑,比如:
val targetDomains = setOf("example.com", "your-universal-link-domain.com") if (targetDomains.contains(uri.host)) { // 优先尝试唤起对应应用 }
内容的提问来源于stack exchange,提问作者Rahul Mishra
相关产品推荐
相关产品推荐

