Android 创建的BroadcastReceiver在安装/卸载任何应用程序时显示应用程序名称和版本号?

Android 创建的BroadcastReceiver在安装/卸载任何应用程序时显示应用程序名称和版本号?,android,broadcastreceiver,Android,Broadcastreceiver,创建的BroadcastReceiver在安装/卸载任何应用程序时显示应用程序名称和版本号。但是我是通过intent.getData()获取包名的。但是,当我试图使用packagemanager查找该应用程序的名称时,它会在所有情况下引发一个异常,即安装/卸载/替换。可能的问题是什么?如何解决 代码: import android.content.BroadcastReceiver; import android.content.Context; import andro

创建的BroadcastReceiver在安装/卸载任何应用程序时显示应用程序名称和版本号。但是我是通过
intent.getData()
获取包名的。但是,当我试图使用packagemanager查找该应用程序的名称时,它会在所有情况下引发一个异常,即安装/卸载/替换。可能的问题是什么?如何解决

代码:

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.widget.Toast;

public class ApplicationStatusNotification extends BroadcastReceiver {

    /**
     * This method receives message for any application status(Install/ Uninstall) and display details.
     */
    @Override
    public void onReceive(Context context, Intent intent) {

        // Get application status(Install/ Uninstall)
        boolean applicationStatus = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
        String toastMessage = null;

        // Check if the application is install or uninstall and display the message accordingly
        if(intent.getAction().equals("android.intent.action.PACKAGE_INSTALL")){
            // Application Install
            toastMessage = "PACKAGE_INSTALL: "+  intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES);
        }else if(intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")){
            // Application Uninstall
            toastMessage = "PACKAGE_REMOVED: "+  intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES);
        }else if(intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
            // Application Replaced
            toastMessage = "PACKAGE_REPLACED: "+  intent.getData().toString() + getApplicationName(context, intent.getData().toString(), PackageManager.GET_UNINSTALLED_PACKAGES);
        }

        //Display Toast Message
        if(toastMessage != null){
            Toast.makeText(context, toastMessage, Toast.LENGTH_LONG).show();
        }
    }

    /**
     * This method get application name name from application package name
     */
    private String getApplicationName(Context context, String data, int flag) {

        final PackageManager pckManager = context.getPackageManager();
        ApplicationInfo applicationInformation;
        try {
            applicationInformation = pckManager.getApplicationInfo(data, flag);
        } catch (PackageManager.NameNotFoundException e) {
            applicationInformation = null;
        }
        final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");

        return applicationName;
    }
}
我按照下面的示例介绍了BroadcastReceiver:

<receiver android:name="PackageChangeReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED"/>
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <data android:scheme="package"/>
    </intent-filter>
</receiver>

现在,一旦调用PackageChangeReceiver.onReceive(..),Intent.getData()Uri就会包含一些内容<代码>包:my.test.package由Uri.toString()返回。要使用PackageManager搜索此应用程序信息,应仅提取可由
Uri.getSchemeSpecificPart()
检索的包名,该文件应仅提供
my.test.package


此外,根据快速测试,似乎很可能在删除软件包后再也没有可用的ApplicationInfo了。

有一件事您最想更改,而不是侦听Intent.ACTION\u package\u安装,您可能正在查找Intent.ACTION\u package\u。根据文档,第一个应该从未被使用过,如果您收到这样的操作,这是非常令人惊讶的。是的,但仍然是pckManager.getApplicationInfo(packageName,flag)正在抛出NameNotFoundException异常。您可以在Receive方法Log.d(“MyApp”,“Receive intent:+intent”)中添加它吗;并添加logcat消息?谢谢兄弟。。。它在安装应用程序时起作用,但在卸载应用程序时,我仍然面临同样的问题。