一、包可见性设置
在Android11中,除了默认的一些应用外,我们不能直接获取到软件包是否已经安装了,换句话说我们安装了一个应用,但是我们调用 getInstalledApplications() 或 getInstalledPackages()方法时可能没有返回对应的包名,这就是Android11引入的包可见性的概念。
Android11这么做的意义:
鼓励最小权限原则,需要与哪些应用交互,就申请哪些包名;
帮助 Google Play 等应用商店评估应用的隐私性和安全性;
包可见性要求:
1、升级Android的Gradle到3.6.0或更高版本,在Android Studio里配置:
"com.android.tools.build:gradle:3.6.0"
2、确保应用的 targetSdkVersion 设为 30以上
3、在AndroidManifest.xml清单文件中,使用<queries>声明我们的应用期望与那些应用交互
<manifest package="com.example.app">
...
// 在应用的AndroidManifest.xml添加如下<queries>标签
<queries>
<package android:name="com.tencent.mm" /> // 指定微信包名
</queries>
...
</manifest>
二、app是否存在检测方法
法一:
final PackageManager packageManager = context.getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(pkgName, PackageManager.MATCH_UNINSTALLED_PACKAGES);
return packageInfo!=null;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return false;
}
法二:
final PackageManager packageManager = context.getPackageManager();
List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
List pName = new ArrayList();
if (pinfo != null) {
for (int i = 0; i < pinfo.size(); i++) {
String pn = pinfo.get(i).packageName;
pName.add(pn);
}
}
return pName.contains(pkgName);
法三:
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(pkgName, 0);//APPNAME应用包名
} catch (Exception e) {
packageInfo = null;
e.printStackTrace();
}
if (packageInfo == null) {
Toast.makeText(context, "没有安装", Toast.LENGTH_SHORT).show();
return false;
} else {
Toast.makeText(context, "已经安装", Toast.LENGTH_SHORT).show();
return true;
}
法四:
PackageManager packageManager = context.getPackageManager();// 获取packagemanager
List installedList = packageManager.getInstalledPackages(0);// 获取所有已安装程序的包信息
Iterator iterator = installedList.iterator();
PackageInfo info;
String name;
while(iterator.hasNext())
{
info = (PackageInfo) iterator.next();
name = info.packageName;
if(name.equals(pkgName))
{
return true;
}
}
return false;
法五:
if (pkgName== null || pkgName.isEmpty()) {
Toast.makeText(context, "没安装", Toast.LENGTH_SHORT).show();
return false;
}
final PackageManager packageManager = context.getPackageManager();
List<PackageInfo> info = packageManager.getInstalledPackages(0);
if(info == null || info.isEmpty()){
Toast.makeText(context, "没安装", Toast.LENGTH_SHORT).show();
return false;
}
for ( int i = 0; i < info.size(); i++ ) {
if(pkgName.equals(info.get(i).packageName)) {
Toast.makeText(context, "安装了", Toast.LENGTH_SHORT).show();
return true;
}
}
Toast.makeText(context, "没安装", Toast.LENGTH_SHORT).show();
return false;