介绍
Android 15 增加了新的 API UriRelativeFilterGroup
和 UriRelativeFilter
来扩展 IntentFilter 的功能,使其支持更精确的 Intent 解析。UriRelativeFilterGroup
包含一组 UriRelativeFilter
对象,这些对象组成一组必须满足的 Intent 匹配规则,其中包括网址查询参数、网址片段以及屏蔽或排除规则。
适配指导
我们可以使用新的 <uri-relative-filter-group>
标签在 AndroidManifest 文件中定义这些新规则。也可以选择包含 android:allow
标记该组过滤是否启用。可以包含已有的 <data>
标记以及包含新的 android:query
和 android:fragment
属性的 <data>
标记。
-
<uri-relative-filter-group>
组必须包含一个或多个 UriRelativeFilter
。
-
<uri-relative-filter-group>
组包括 path、query 和 fragment。仅当组中的所有 UriRelativeFilter
都匹配时,该组才被视为匹配。
示例
下面是 AndroidManifest
语法的示例:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="itmob.cn" />
<uri-relative-filter-group android:allow="true" tools:targetApi="35">
<data android:pathPrefix="/log" />
<data android:query="name=itmob" />
</uri-relative-filter-group>
<uri-relative-filter-group android:allow="false" tools:targetApi="35">
<data android:pathPrefix="/log" />
<data android:fragment="jetpack" />
</uri-relative-filter-group>
</intent-filter>
-
上例中配置了一个 intent-filter
,且配置了两个 uri-relative-filter-group
,但这时 https://itmob.cn 并不符合配置的精确解析过滤条件,通过 Android Studio 的 App Links Assistant 测试时,应用并不能匹配该 URL(而是 Chrome 浏览器处理了该 URL)
-
如果测试的 URL 只部分符合配置的过滤条件(path 符合,但没有正确的 query 条件),App Link 依然不能正确匹配(而是 Chrome 浏览器处理了该 URL)
-
测试的 URL 的 path 和 query 都跟 uri-relative-filter-group
配置的过滤条件相符,则我们的应用能够正确匹配该 URL
-
测试的 URL 虽然符合 uri-relative-filter-group
配置的过滤条件,但该组过滤条件配置了 android:allow="false"
,所以它是被排除不被处理的,我们的应用则不会匹配该 URL(而是 Chrome 浏览器处理了该 URL)
-
如下来看一下不使用精确解析的配置的对比
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="itmob.cn" />
</intent-filter>
如上例没有配置 uri-relative-filter-group
时,有没有path 或 query 都会被我们的应用正确匹配处理
在使用 UriRelativeFilterGroup 时可能会遇到:
Android Studio 提示:“Element uri-relative-filter-group is not allowed here”
编译时报错:”AAPT: error: unexpected element found in ”
这时因为当前 Android Studio 和 AGP (Android Gradle Plugin) 的版本不支持UriRelativeFilterGroup
。
具体问题和解决方法详见:Android Exception - AAPT: error: unexpected element found in
其他
官方文档:Expanded IntentFilter capabilities
其他
Android 15 功能和变更列表
翻译:2024 年 9 月 3 日 Android 15 已发布至 AOSP
Android 15 新功能和 API 详解:Private Space/私密空间功能简介
Android 15 新功能和 API 详解:录屏检测,addScreenRecordingCallback
Android 15 新功能和 API 详解:应用程序启动信息,ApplicationStartInfo
Android 15 新功能和 API 详解:支持 16 KB 页面大小
Android 15 新功能和 API 详解:更精确的 Intent 解析,UriRelativeFilterGroup 和 UriRelativeFilter