0
点赞
收藏
分享

微信扫一扫

Android 启动其他应用Activity/Service失败问题

落拓尘嚣 2022-02-14 阅读 125

本文仅针对Android11,如果你的模拟器或设备是Android11的话,请继续看下去。

一、提出问题

最近在使用一个应用绑定另外一个应用的Service时,无论如何都绑定不上,现象是Service的onCreate()和onStartCommand()回调都没有执行。说明应用之间的通信出现了问题。

二、调查过程

了解到我们现在使用的模拟器使用的是Android11,所以抱着试一试的态度去看了一下Android11的新特性。发现在Android11中新增了一项“包可见性”。

参考连接:Android官方文档-Android11新特性

通过这个描述,感觉我遇到的问题与这个有一定的关系。

进一步调查,原来Android11中限制了应用的可见性。同时,只有部分应用是对所有应用自动可见的。链接:Android官方文档-自动可见应用

三、解决方案

方案一:在Manifest中添加<queries>标签,然后使用指定包名。

参考链接:Android官方文档-查询指定软件包并与之交互

<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权限。

注意:这种方法比较暴力,添加权限后,应用就可以访问所有的已安装应用了。但是官方明确指出不建议这样做。

在绝大多数情况下,可以通过以下方式实现您应用的用例:与一组自动可见的应用交互,并在您的清单文件中声明您的应用需要访问的其他应用。为了尊重用户隐私,您的应用应请求应用正常工作所需的最小软件包可见性。

参考链接:Android官方文档-查询所有应用及与之交互

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
举报

相关推荐

0 条评论