今天在开发微博分享时遇到一个问题,手机未安装新浪微博APP时,调用微博网页版,但是微博网页版加载太慢,于是应产品需求添加了微博是否安装的判断。
这里介绍两种方法:
一、是根据 PackageManager.getInstalledPackages方法,获取应用列表,通过微博包名判断。
代码如下:
public static boolean isWeiboInstalled(@NonNull Context context) { PackageManager pm; if ((pm = context.getApplicationContext().getPackageManager()) == null) { return false; } List<PackageInfo> packages = pm.getInstalledPackages(0); for (PackageInfo info : packages) { String name = info.packageName.toLowerCase(Locale.ENGLISH); if ("com.sina.weibo".equals(name)) { return true; } } return false; }
经测试只支持大部分机型支持,遇到一个小米的安卓11的测试机上,需要打开获取应用列表权限。不符合应用场景。
二、根据 PackageManager.getPackagesForUid来获取列表,该方法无需获取任何权限,经测试暂未遇到问题。
代码如下:
public static boolean isWeiBoInstalled(@NotNull Context context) { PackageManager pm = context.getPackageManager(); //系统应用uid从1000开始,用户应用uid从10000(FIRST_APPLICATION_UID)开始,直接合并查询 for (int i = 10000; i <= 11000; i++) { try { String[] apps = pm.getPackagesForUid(i); if (apps != null) { for (String app : apps) { PackageInfo info = pm.getPackageInfo(app, 0); if (info != null && info.packageName.equals("com.sina.weibo")) { return true; } } } } catch (Exception e) { e.printStackTrace(); } } return false; }
在此记录下结论!