本文仅针对Android11,如果你的模拟器或设备是Android11的话,请继续看下去。
一、提出问题
最近在使用一个应用绑定另外一个应用的Service时,无论如何都绑定不上,现象是Service的onCreate()和onStartCommand()回调都没有执行。说明应用之间的通信出现了问题。
二、调查过程
了解到我们现在使用的模拟器使用的是Android11,所以抱着试一试的态度去看了一下Android11的新特性。发现在Android11中新增了一项“包可见性”。
通过这个描述,感觉我遇到的问题与这个有一定的关系。
进一步调查,原来Android11中限制了应用的可见性。同时,只有部分应用是对所有应用自动可见的。链接:Android官方文档-自动可见应用
三、解决方案
方案一:在Manifest中添加<queries>标签,然后使用指定包名。
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
方案二:在Manifest中添加<queries>标签,并指定过滤器。
参考链接:Android官方文档-在给定 intent 过滤器的情况下查询应用及与之交互
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
方案三:如果使用content provider,则需要在<queries>中指定授权
参考链接:Android官方文档-在给定提供程序授权的情况下查询应用及与之交互
<manifest package="com.example.suite.enterprise">
<queries>
<provider android:authorities="com.example.settings.files" />
</queries>
...
</manifest>
方案四:添加QUERY_ALL_PACKAGES权限。
注意:这种方法比较暴力,添加权限后,应用就可以访问所有的已安装应用了。但是官方明确指出不建议这样做。
“在绝大多数情况下,可以通过以下方式实现您应用的用例:与一组自动可见的应用交互,并在您的清单文件中声明您的应用需要访问的其他应用。为了尊重用户隐私,您的应用应请求应用正常工作所需的最小软件包可见性。“
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
作者:pc_Li
发布于:CSDN