当我们尝试通过 Intent 打开另一个程序时,Logcat 中可能出现一下错误:
AppsFilter system_server I interaction: PackageSetting{6ec3c0b cn.itmob.test/10337} -> PackageSetting{7eda3ef cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{a16a02c cn.itmob.compose.sample/10329} -> PackageSetting{7eda3ef cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{5a59b3 com.google.android.microdroid.empty_payload/10256} -> PackageSetting{7eda3ef cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{9efbc6b com.google.samples.apps.nowinandroid.debug/10327} -> PackageSetting{7eda3ef cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{6adb168 com.example.jetnews/10320} -> PackageSetting{7eda3ef cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{6ec3c0b cn.itmob.test/10337} -> PackageSetting{a80d0ed cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{a16a02c cn.itmob.compose.sample/10329} -> PackageSetting{a80d0ed cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{5a59b3 com.google.android.microdroid.empty_payload/10256} -> PackageSetting{a80d0ed cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{9efbc6b com.google.samples.apps.nowinandroid.debug/10327} -> PackageSetting{a80d0ed cn.itmob.demo/10275} BLOCKED
AppsFilter system_server I interaction: PackageSetting{6adb168 com.example.jetnews/10320} -> PackageSetting{a80d0ed cn.itmob.demo/10275} BLOCKED
这是 Android 11 (API 级别 30) 增加了安全限制,如果应用以 Android 11(API 级别 30)或更高版本为目标平台(targetSDKVersion),需要在 AndroidManifest.xml 清单文件中加入 权限申请,指定需要在设备上查看(或使用)的其他应用的包名(或 QUERY_ALL_PACKAGES 权限)才能检测到手机上安装的三方应用。
解决办法:
-
降低目标平台(targetSDKVersion)
在 build.gradle 中,降低 targetSDKVersion 为 29 或更低版本
-
指定要查询或交互的应用包名
如果知道要查询或交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),将其软件包名称添加到 <queries>
元素内的一组 <package>
元素中:
<manifest package="cn.itmob.test">
<queries>
<package android:name="cn.itmob.compose.sample" />
<package android:name="cn.itmob.demo" />
</queries>
...
</manifest>
-
查询所有应用
如果您的应用可能需要查询设备上所有已安装的应用或与之交互(这种情况很少见),您可以选择 Android 11 中引入的 QUERY_ALL_PACKAGES 权限。
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
-
通过 标签指定 intent 过滤器 (intent)或 提供授权
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
<provider android:authorities="com.example.settings.files"/>
</queries>
...
</manifest>
更多关于 Android 11 包可见性的介绍:适配 Android 11 (R) 的包可见性