You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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路径匹配的语法限制,实现逻辑最稳妥:

  1. 保留你现有的Manifest配置不变,仍然捕获所有符合规则的链接到对应的处理Activity
  2. 在处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:09:05