ITmob-Ly
发布于 2024-09-04 / 199 阅读
0

Android Exception - AppsFilter interaction: PackageSetting -> PackageSetting BLOCKED

当我们尝试通过 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 权限)才能检测到手机上安装的三方应用。

解决办法:

  1. 降低目标平台(targetSDKVersion)

    在 build.gradle 中,降低 targetSDKVersion 为 29 或更低版本

  2. 指定要查询或交互的应用包名

    如果知道要查询或交互的一组特定应用(例如,与您的应用集成的应用或您使用其服务的应用),将其软件包名称添加到 <queries> 元素内的一组 <package> 元素中:

    <manifest package="cn.itmob.test">
        <queries>
            <package android:name="cn.itmob.compose.sample" />
            <package android:name="cn.itmob.demo" />
        </queries>
        ...
    </manifest>
    
  3. 查询所有应用

    如果您的应用可能需要查询设备上所有已安装的应用或与之交互(这种情况很少见),您可以选择 Android 11 中引入的 QUERY_ALL_PACKAGES 权限。

    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    
  4. 通过 标签指定 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) 的包可见性