卸载时获取包(app)版本名称

时间:2013-09-19 15:02:57

标签: android android-layout android-intent android-emulator android-package-managers

我有以下广播接收器来捕获用户在设备上卸载应用程序时的事件,从技术上讲,我收到了行动ACTION_PACKAGE_REMOVED的意图:

public class appUninstallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent != null) {
            if (intent.getAction().equals(intent.ACTION_PACKAGE_REMOVED))   {
                try {
                   String packageName = intent.getData().toString();
                   //Logcat shows the packageName is "com.XXX.YYY"
                   Log.v("debug",packageName);

                   PackageManager packageManager = context.getPackageManager();
                   PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
                   //Got NameNotFoundException
                   Log.v("debug",packageInfo.versionName);

                }catch(NameNotFoundException e){
                     e.printStackTrace();
                }
            }
        }
    }
}

上述接收器运行良好,但当它尝试使用packageInfo.versionName提取卸载应用程序(包)的版本名称时, NameNotFoundException 正在上升。

我得到的packageName是“com.XXX.YYY”,这正是我正在卸载的应用程序的包名。但是为什么我无法使用上面的代码获取版本名称?

(顺便说一下,当app卸载开始时会触发上面的接收器,是因为系统在开始卸载之前已经删除了元数据吗?)

3 个答案:

答案 0 :(得分:3)

  

但是为什么我无法使用上面的代码获取版本名称?

您会注意到操作名称(ACTION_PACKAGE_REMOVED)过去时。操作名称不是ACTION_PACKAGE_REMOVINGACTION_PACKAGE_WILL_BE_REMOVED_IN_THE_FUTUREACTION_PACKAGE_USER_WANTS_TO_REMOVE_THIS_PACKAGE_WHICH_WE_WILL_DO_ANY_MINUTE_NOW

The documentation也使用过去时:

  

现有的应用程序包已从设备中删除。

因此,如果正在卸载应用程序,则在发送此广播时设备上不存在该应用程序,因此无法通过PackageManager使用该应用程序。

答案 1 :(得分:-1)

尝试使用此代码获取正在卸载的应用程序包名称:

Uri uri = intent.getData();
    String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
    System.out.println("Pakcge Removed: " + pkg);

答案 2 :(得分:-1)

你可以使用这个广播公司:

    public class UninstallHelper extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Uri uri = intent.getData();
        String packageName = uri != null ? uri.getSchemeSpecificPart() : null;
        Bundle b = intent.getExtras();
        int uid = b.getInt(Intent.EXTRA_UID);

        boolean replacing = b.getBoolean(Intent.EXTRA_REPLACING);


        Toast.makeText(context, "Package removed: " + packageName + " " + uid + "; replacing: " + replacing, Toast.LENGTH_LONG).show();


    }

}

然后在清单中:

   <receiver android:name="braadcasters.UninstallHelper">
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <action android:name="android.intent.action.UID_REMOVED" />
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>