在Android 11上,我们可以看到很多的更新都是用来保护隐私的,如果你的app 在使用PackageManger的方法来获取安装的应用列表,
那么在Android11上,就需要做一点改变了。
我们来看看一下获取应用列表的代码,会不会和你的很相似
List<ApplicationInfo> allApps = getPackageManager().getInstalledApplications(0);
for(ApplicationInfo ai : allApps) {
("packageName", );
}
现在你是在11上使用,代码即使一样,除非你在中添加代码,否则是不会生效的。
这里有3种不同的方法去查询已经安装的app,让我们瞧瞧
包名查询
如果你已经知道想查询的应用包名,那么你可以这样做
<manifest xmlns:andro
xmlns:tools="/tools"
package=""
<queries>
<package android:name=""/>
<package android:name=""/>
</queries>
</manifest>
通过intent filter查询
如果你不知道应用的包名,只是想查询具有某种功能的应用,那么可以使用以下的方式
<manifest xmlns:andro
xmlns:tools="/tools"
package=""
<queries>
<intent>
<action android:name=""/>
<data android:mimeType="image/png"/>
</intent>
</queries>
</manifest>
这里需要注意的是:
- <intent> 中只能有一个<action> 元素
- <data>中也只能有这些属性: mimeType,scheme 和host
查询所有的应用
11上添加了一个QUERY_ALL_PACKAGES这样的权限,我们配置上就ok了
<uses-permission android:name=".QUERY_ALL_PACKAGES"/>
如果我们使用 作为action元素,那么不添加权限,也是可以绕过去的,因为几乎所有应用都会有这个action。不知道这个算不算是bug了。