如何在Android广播接收器中获取安装/卸载应用的名称?
获取安装/卸载应用的名称解决方案
嗨,你的BroadcastReceiver已经能准确监听应用的安装和卸载事件了,要拿到对应的应用名称,只需要在现有逻辑基础上补充两步操作就行,我给你详细拆解一下:
第一步:从广播Intent里提取目标应用包名
ACTION_PACKAGE_ADDED和ACTION_PACKAGE_REMOVED广播的Intent中,data字段携带了目标应用的包名,你可以用下面的代码快速提取:
String packageName = intent.getData().getSchemeSpecificPart();
第二步:通过PackageManager获取应用名称
拿到包名后,调用系统的PackageManager工具类,就能从包名反推出应用的显示名称。这里要注意捕获异常,避免因为包名无效导致崩溃。
修改后的完整Receiver代码
public class PackageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 先提取目标应用的包名 String packageName = intent.getData().getSchemeSpecificPart(); if (packageName == null) { return; } // 获取PackageManager实例,用于查询应用信息 PackageManager packageManager = context.getPackageManager(); String appName = ""; try { // 获取应用的基本信息 ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA); // 转换为用户可见的应用名称 appName = packageManager.getApplicationLabel(appInfo).toString(); } catch (PackageManager.NameNotFoundException e) { // 如果查询失败(比如卸载时应用已被清理),用包名代替名称 appName = packageName; e.printStackTrace(); } switch(intent.getAction()) { case Intent.ACTION_PACKAGE_ADDED: boolean isReplacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); String updateTag = isReplacing ? "(替换更新)" : ""; Log.e("application", "已安装应用:" + appName + updateTag + ",包名:" + packageName); break; case Intent.ACTION_PACKAGE_REMOVED: boolean isForUpdate = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); if(!isForUpdate) { Log.e("application", "已卸载应用:" + appName + ",包名:" + packageName); } break; } } }
重要提醒:Android 11+的权限限制
在Android 11(API 30)及以上系统中,系统默认限制了应用对其他应用包信息的查询权限。如果你的应用需要获取任意应用的名称,需要在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />
如果只需要查询特定几个应用的信息,更推荐用<queries>标签声明目标包名,避免申请宽权限:
<queries> <package android:name="com.example.targetapp" /> <!-- 可以添加多个需要查询的包名 --> </queries>
你的原Manifest中Receiver的配置是完全正确的,不需要修改~
内容的提问来源于stack exchange,提问作者MR.Iraji
相关产品推荐
相关产品推荐

