Android 11最小权限原则有一项规定,使用queryIntentActivities查询,只能查询到一些自动对您的应用可见的应用如:浏览器、apk安装等,其他应用查不到了。
如果想查到那些不可见的应用有两种方式:
一、在Manifest中添加QUERY_ALL_PACKAGES权限
添加了这个QUERY_ALL_PACKAGES权限后可以查到所有应用了,但是如果想上架Google的应用商店是不行的,Google会检测这个然后把你的应用拒掉,国内不知道有没有问题
二、在Manifest中添加<queries>标签
这里我只讲一种是通过URI的方式查询。
例如:
public static List<ResolveInfo> getUPIPackages(Context context){
Intent upiIntent =new Intent(Intent.ACTION_VIEW, Uri.parse("upi://pay"));
PackageManager pm = context.getPackageManager();
List<ResolveInfo> upiPackageInfoList= pm.queryIntentActivities(upiIntent, 0);
return upiPackageInfoList;
}
Uri.parse("upi://pay")这个 upi://pay 是以 scheme为 upi 以host为 pay
所以<queries>方式应该这么写
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="upi" android:host="pay" />
</intent>
</queries>
其它的方式大家可以看这个谷歌的官方文档:
管理软件包可见性 | Android 开发者 | Android Developershttps://developer.android.google.cn/training/basics/intents/package-visibility根据用例配置软件包可见性 | Android 开发者 | Android Developershttps://developer.android.google.cn/training/basics/intents/package-visibility-use-cases#open-urls
通用 Intent | Android 开发者 | Android Developershttps://developer.android.google.cn/guide/components/intents-common#AdbIntents
最后附带获取到packge信息后如何显示logo和appName
PackageManager pm = getContext().getPackageManager();
binding.tvAppName.setText(resolveInfo.loadLabel(pm).toString());
binding.ivLogo.setImageDrawable(resolveInfo.loadIcon(pm));
ResolveInfo就是通过queryIntentActivities得到的