在Android 11中,我们可以看到很多改善隐私的更新。如果您的应用程序使用PackageManager
方法来获取用户设备中已安装应用程序的列表,您必须对使用 Android 11 的设备的代码进行一些更改。
现在,对于使用 Android 11 的用户,代码保持不变,但除非您在AndroidManifest
有 3 种不同的方式查询已安装的应用程序
1.查询具体包
如果您已经知道要查询哪些应用程序,只需在<queries>
中的元素AndroidManifest
.
<manifest package="com.nd1010.app">
<queries>
<package android:name="com.fake.app" /> //replace with com.android.wallpaper.livepicker
<package android:name="com.fake.game" /> //replace with com.gocalsd.symphlyx
</queries>
...
</manifest>
2.使用intent过滤器进行查询
如果您不知道要查询的应用程序的所有包名称,但有一组具有类似功能的应用程序要查询,那么您可以在<queries>
根据您的要求添加元素,就像下面的代码片段中所做的那样。
<manifest package="com.nd1010.app">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
The <intent>
元素看起来很像,但几乎没有什么区别。<intent>
元素有以下限制:
- The
<intent>
元素只能有一个<action>
元素。
- The
<data>
元素只能具有以下属性:mimeType
, scheme
and host
.
3.查询所有应用
如果您想像之前那样查询用户的所有应用程序,则需要包括QUERY_ALL_PACKAGES
的许可AndroidManifest
。这是一个正常的权限,一旦安装应用程序就会被授予。
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
理想情况下,人们应该请求最少数量的包裹并尊重用户的隐私。在大多数情况下,不需要此权限,只有对于像启动器这样的应用程序,才需要向用户请求查询手机上所有已安装应用程序的权限。
我在探索时注意到一个漏洞<queries>
元素,如果添加android.intent.action.MAIN
作为意图过滤器中的操作元素,您可以在不添加权限的情况下看到用户的几乎所有应用程序,因为几乎所有应用程序都会在意图过滤器中包含此元素AndroidManifest
.