如何获取已安装或删除的应用程序的名称?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取已安装或删除的应用程序的名称?相关的知识,希望对你有一定的参考价值。

我编写了一个广播接收器来检测安装和删除应用程序。但我也希望获得已安装或删除的应用程序的名称。我怎样才能做到这一点?

这是我的BroadcastReceiver:

public class PackageReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        switch(intent.getAction())
        {
            case Intent.ACTION_PACKAGE_ADDED:
                String replaced = "";
                if(intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
                {
                    replaced = "replaced";
                }
                Log.e("application", "installed " + replaced);

                break;

            case Intent.ACTION_PACKAGE_REMOVED:
                if(!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
                {
                    Log.e("application", "removed");
                }

                break;
        }

    }
}

在清单中:

<receiver
    android:name=".receivers.PackageReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
         <action android:name="android.intent.action.PACKAGE_ADDED" />
         <action android:name="android.intent.action.PACKAGE_REMOVED" />
         <data android:scheme="package" />
    </intent-filter>
</receiver>
答案

结合在android documentation和这个answer上发现的堆栈溢出信息,我想出了以下内容。您正在使用的意图可能包含额外的EXTRA_UID,其中包含已修改应用的uid。使用uid,您可以获得应用名称。但是你只能在ACTION_PACKAGE_ADDED意图上执行此操作,因为在ACTION_PACKAGE_REMOVED应用程序已经删除并且您无法获取其名称(您仍然可以获得uid)。

检查此示例:

int uid = intent.getIntegerExtra(Intent.EXTRA_UID);
String appName = context.getPackageManager().getNameForUid(uid);

所以在你的情况下它将是:

public class PackageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch(intent.getAction())
        {
            case Intent.ACTION_PACKAGE_ADDED:
                String replaced = "";
                String appName = "";
                int uid = -1;
                if(intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
                {
                    replaced = "replaced";
                }
                uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
                if(uid != -1){
                    appName = context.getPackageManager().getNameForUid(uid);
                }
                Log.e("application", "installed " + replaced + " uid " + uid + " appname " + appName);

                break;

            case Intent.ACTION_PACKAGE_REMOVED:
                if(!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
                {
                    Log.e("application", "removed");
                }
                break;
        }
    }
}

使用此代码,我从Google Play安装Google地球后看到这是用logcat编写的:

安装了uid 10404 appname com.google.earth

以上是关于如何获取已安装或删除的应用程序的名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取包含名称和版本对的已安装 Jenkins 插件列表

如何在不使用文件或文件路径的情况下获取文件系统(不仅仅是已安装的)中 APK 文件的信息?

如何通过 YouTube api v2/v3 (JSON) 获取已删除视频的信息

当sqlite android片段中的数据更改或删除时如何刷新recyclerview?

如何获取默认的 iOS 浏览器名称?

替换或删除后台堆栈上现有片段的代码不起作用