Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 卸载程序包(应用程序)时获取其版本名_Android_Android Layout_Android Intent_Android Emulator_Android Package Managers - Fatal编程技术网

Android 卸载程序包(应用程序)时获取其版本名

Android 卸载程序包(应用程序)时获取其版本名,android,android-layout,android-intent,android-emulator,android-package-managers,Android,Android Layout,Android Intent,Android Emulator,Android Package Managers,当用户在设备上卸载应用程序时,我有以下广播接收器来捕获事件,从技术上讲,我收到了行动的意图: 上述接收器工作正常,只是当它试图用packageInfo.versionName提取卸载应用程序(软件包)的版本名时,NameNotFoundException正在上升 我得到的packageName是“com.XXX.YYY”,这正是我正在卸载的应用程序的包名。但是为什么我不能用上面的代码获得版本名呢 (顺便问一下,上面的接收器是在应用程序卸载开始时触发的,是不是因为系统在开始卸载之前已经删除了元数据

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

上述接收器工作正常,只是当它试图用
packageInfo.versionName
提取卸载应用程序(软件包)的版本名时,NameNotFoundException正在上升

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

(顺便问一下,上面的接收器是在应用程序卸载开始时触发的,是不是因为系统在开始卸载之前已经删除了元数据?)

但是为什么我不能用上面的代码获得版本名呢

您会注意到操作名称(
action\u PACKAGE\u REMOVED
)是过去时。动作名称不是
action\u PACKAGE\u REMOVING
action\u PACKAGE\u将在未来被删除
,或者
action\u PACKAGE\u USER\u想要删除这个我们现在随时都要做的包

也使用过去时:

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


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

获取正在卸载的应用程序的软件包名称:

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

您可以使用此广播机:

    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>


文档中说“已有的应用程序包已从设备中删除”。这可能就是NameNotFoundException上升的原因。请告诉我您是如何捕获卸载事件的。我需要它,但我是否可以收到其他广播意图,我知道应用程序将被卸载,以便我仍然可以访问包版本名?或任何解决方法?@Mellon:“但是否有其他广播意图……”——与卸载无关。“或任何解决方案?”——因为我不知道真正的业务问题是什么,所以我不能建议解决方案。尝试确定设备上不再存在的应用程序的版本名有什么意义?
   <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>