Android App Links如何排除/browser/特定子目录不触发应用内跳转
实现方案
有两种成熟方案可以满足需求,优先推荐全版本兼容的代码校验方案:
方案1:API 31+ 高级路径匹配(仅支持Android 12及以上系统)
Android 12(API 31)开始新增android:pathAdvancedPattern属性,支持完整正则表达式匹配,可直接配置否定规则排除包含/browser/的路径,Manifest配置如下:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 仅API 31+生效的规则:匹配含.且不含/browser/的路径 --> <data android:host="www.rakuten.com" android:scheme="https" android:pathAdvancedPattern="^(?=.+\..+$)(?!.*\/browser\/).*$" /> <!-- 兼容API 31以下的原有规则,需配合代码二次校验 --> <data android:host="www.rakuten.com" android:scheme="https" android:pathPattern=".*\..*" /> </intent-filter>
方案2:全量捕获后代码校验(全版本兼容,优先推荐)
该方案不受系统版本限制,无需处理Manifest路径匹配的语法限制,实现逻辑最稳妥:
- 保留你现有的Manifest配置不变,仍然捕获所有符合规则的链接到对应的处理Activity
- 在处理Activity的
onCreate方法中先做路径校验,包含/browser/的链接直接抛给系统浏览器,再结束当前页面,示例代码如下:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val targetUri = intent.data ?: run { finish() return } // 匹配到/browser/路径则直接跳转系统浏览器 if (targetUri.path?.contains("/browser/") == true) { val browserIntent = Intent(Intent.ACTION_VIEW, targetUri).apply { addCategory(Intent.CATEGORY_BROWSABLE) setPackage(null) // 强制跳出当前应用选择系统浏览器打开 } startActivity(browserIntent) finish() return } // 原有业务逻辑:提取最后一段路径跳转对应品牌页 val pathSegments = targetUri.pathSegments if (pathSegments.isNotEmpty()) { val brandDomain = pathSegments.last() // 校验品牌域名有效性后跳转对应页面 navigateToBrandPage(brandDomain) } finish() }
内容的提问来源于stack exchange,提问作者shanraisshan
相关产品推荐
相关产品推荐

