前两天公司一同事做了一下 AIDL 的尝试,发现在 Android 11 的设备上无法运行,经过检索得知,在 Android 11 (Target API 30)的情况下,需要指定软件包的可见性。
官方的说明如下:
为了更好地 “问责” 访问已安装应用的行为,默认情况下,以 Android 11 为目标平台 (目标 API level 为 30) 的应用默认将只能检测到部分过滤后的已安装应用。如果想获取更多别的已安装应用列表信息,则需要在应用内的 Android manifest 中添加 <queries> 元素,从而拓宽访问范围。
这里有两种形式,一种是显式的指定需要交互的应用的包名,可用于同一公司内部相关应用的相互访问(可以配置多个 package 标签)。
<manifest package="com.example.game"> <queries> <!-- 声明所要进行交互的应用名 --> <package android:name="com.example.service" /> </queries> ... </manifest>
还有一种隐式的作用于 intent,用于泛匹配的方式:
<manifest package="com.example.game"> <queries> <!-- 声明要查询的 intents 例如下列标签声明了一个自定义的分享视图的 intent --> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
对于 Content Provider 这种特殊的跨进程组件则特殊一点:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
对于需要配置多项的情况按以下二选一:
- 在单个
<provider>
元素中,声明以英文分号分隔的授权列表。
- 添加多个
<provider>
元素,让这些元素全部在同一<queries>
元素中。在每个<provider>
元素中,声明单项授权或以英文分号分隔的授权列表。
总结一下:
就是需要访问其他 APP 时,显式或者隐式的将用于寻找对方的,比如包名或者intent,在 manifest 中使用 queries 标签包裹起来,以获取更大的访问范围。
指定后,可解 AIDL 在 Android 11 上无法连接的问题。
参考:https://developer.android.google.cn/training/basics/intents/package-visibility
本站由以下主机服务商提供服务支持:
0条评论