You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:57