第一种方法
通过Application拿到PackageManager,然后通过PackageManager的getInstalledPackages(int flags)获取到安装应用列表的PackageInfo,遍历看是否有某应用包名来判断是否安装了某应用。
publicbooleanisWxInstall(){ PackageManager packageManager = MyApplication.getInstance().getPackageManager(); List pinfo = packageManager.getInstalledPackages(0);if(pinfo !=null) {for(inti =0; i < pinfo.size(); i++) { String pn = pinfo.get(i).packageName;if(pn.equals("com.tencent.mm")) {returntrue; } } }returnfalse; }
如果禁止读取获取已安装应用列表权限后,上述方法可能会导致实际的结果不正确,于是分别找了vivo、华为和小米手机进行了验证。
验证
* vivo x9 X7Funtouch OS_3.1 android 7.1.2 华为
* HUAWEI Mate10 Pro EMUI 8.0.0 android 8.0.0
* MI 5 MIUI 9.5.2.0 android 7.0
因为国内厂商的这个读取已安装应用列表的权限在被禁了以后,第三方应用的PackageInfo用getInstalledPackages()方法是获取不到的。
第二种方法
publicbooleanisWxInstall2(){ PackageManager packageManager = MyApplication.getInstance().getPackageManager(); String packageName ="com.tencent.mm";booleanhasInstallWx;try{ PackageInfo packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_GIDS); hasInstallWx = packageInfo !=null; }catch(PackageManager.NameNotFoundException e) { hasInstallWx =false; e.printStackTrace(); }returnhasInstallWx; }
这种方案用的是PackageManager里的getPackageInfo()方法,该方法不能获得已安装应用的列表,但是可以获得指定包名的PackageInfo,当指定包名的PackageInfo不存在的时候,系统会抛出PackageManager.NameNotFoundException异常,可以以此为依据来进行判断系统是否安装某应用。
同样,Android原生系统用上述方法是肯定能够获得正确结果的,但不知道国内手机厂商的ROM是否对该方法也进行了修改,于是用上述三部手机分别进行了验证,得到的结果是一样的。在禁止读取已安装列表权限以后,能够获得正确的结果。
就目前手机厂商的ROM来说,用上述方案是能够正确获得手机是否安装某应用的。