ITmob-Ly
发布于 2024-08-27 / 221 阅读
0

Android 15 新功能和 API 详解:更精确的 Intent 解析,UriRelativeFilterGroup 和 UriRelativeFilter

介绍

Android 15 增加了新的 API UriRelativeFilterGroupUriRelativeFilter 来扩展 IntentFilter 的功能,使其支持更精确的 Intent 解析。UriRelativeFilterGroup包含一组 UriRelativeFilter 对象,这些对象组成一组必须满足的 Intent 匹配规则,其中包括网址查询参数、网址片段以及屏蔽或排除规则。

适配指导

我们可以使用新的 <uri-relative-filter-group> 标签在 AndroidManifest 文件中定义这些新规则。也可以选择包含 android:allow 标记该组过滤是否启用。可以包含已有的 <data> 标记以及包含新的 android:query 和 android:fragment 属性的 <data> 标记。

  1. <uri-relative-filter-group> 组必须包含一个或多个 UriRelativeFilter

  2. <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>
  1. 上例中配置了一个 intent-filter,且配置了两个 uri-relative-filter-group,但这时 https://itmob.cn 并不符合配置的精确解析过滤条件,通过 Android Studio 的 App Links Assistant 测试时,应用并不能匹配该 URL(而是 Chrome 浏览器处理了该 URL)

    UriRelativeFilterGroup

  2. 如果测试的 URL 只部分符合配置的过滤条件(path 符合,但没有正确的 query 条件),App Link 依然不能正确匹配(而是 Chrome 浏览器处理了该 URL)

    UriRelativeFilterGroup

  3. 测试的 URL 的 path 和 query 都跟 uri-relative-filter-group 配置的过滤条件相符,则我们的应用能够正确匹配该 URL

    UriRelativeFilterGroup

  4. 测试的 URL 虽然符合 uri-relative-filter-group 配置的过滤条件,但该组过滤条件配置了 android:allow="false",所以它是被排除不被处理的,我们的应用则不会匹配该 URL(而是 Chrome 浏览器处理了该 URL)

    urirelativefiltergroup4.png

  5. 如下来看一下不使用精确解析的配置的对比

    <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

在使用 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