context.getPackageManager().getApplicationInfo()异常处理

本文探讨了在Android11及以上版本中,通过context.getPackageManager().getApplicationInfo()方法检查第三方应用安装状态时遇到的异常问题。介绍了两种解决PackageManager$NameNotFoundException的方法,并提到了可能遇到的编译错误及其解决方案。

context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);异常处理

1.检测是否已安装了指定包名的第三方app
在这里插入图片描述

通过上面代码可以去判断当前设备是否已经安装了该包名的第三方app。如果不抛异常,说明这设备已经安装了。如果未安装,就一定会抛异常。
但是,发现,在android11以及更高版本的手机中,即使已经安装了该包名的app,也仍然会抛异常: android.content.pm.PackageManager$NameNotFoundException

2.解决方案

方案1
在app的AndroidManifest.xml中添加如下配置
在这里插入图片描述使用方案1的方式可能导致编译失败:Missing ‘package’ key attribute on element package at AndroidManifest.xml,那是因为gradle版本低的话导致的。可以通过升级gradle版本解决。
在这里插入图片描述

方案2
在app的AndroidManifest.xml中添加如下配置

android:name="android.permission.QUERY_ALL_PACKAGES"
在这里插入图片描述如有疑问欢迎留言~~~~~~~~~

object AppUtils { /** * 获取应用程序名称 */ @Synchronized fun getAppName(context: Context): String? { try { val packageManager: PackageManager = context.packageManager val packageInfo: PackageInfo = packageManager.getPackageInfo( context.packageName, 0 ) val labelRes = packageInfo.applicationInfo.labelRes return context.resources.getString(labelRes) } catch (e: Exception) { e.printStackTrace() } return null } /** * 获取应用程序版本名称信息 * @param context * @return 当前应用的版本名称 */ @Synchronized fun getVersionName(context: Context): String? { try { val packageManager: PackageManager = context.packageManager val packageInfo: PackageInfo = packageManager.getPackageInfo( context.packageName, 0 ) return packageInfo.versionName } catch (e: Exception) { e.printStackTrace() } return null } /** * 获取应用程序版本名称信息 * @param context * @return 当前应用的版本名称 */ @Synchronized fun getVersionCode(context: Context): Int { try { val packageManager: PackageManager = context.packageManager val packageInfo: PackageInfo = packageManager.getPackageInfo( context.packageName, 0 ) return packageInfo.versionCode } catch (e: Exception) { e.printStackTrace() } return 0 } /** * 获取应用程序版本名称信息 * @param context * @return 当前应用的版本名称 */ @Synchronized fun getPackageName(context: Context): String? { try { val packageManager: PackageManager = context.packageManager val packageInfo: PackageInfo = packageManager.getPackageInfo( context.packageName, 0 ) return packageInfo.packageName } catch (e: Exception) { e.printStackTrace() } return null } /** * 获取图标 bitmap * @param context */ @Synchronized fun getBitmap(context: Context): Bitmap { var packageManager: PackageManager? = null var applicationInfo: ApplicationInfo? = null try { packageManager = context.applicationContext .packageManager applicationInfo = packageManager.getApplicationInfo( context.packageName, 0 ) } catch (e: PackageManager.NameNotFoundException) { applicationInfo = null } val d = packageManager!!.getApplicationIcon(applicationInfo!!) //xxx根据自己的情况获取drawable val bd = d as BitmapDrawable return bd.bitmap } }转Android java
06-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值