卸载时获取包(应用程序)版本名称
Posted
技术标签:
【中文标题】卸载时获取包(应用程序)版本名称【英文标题】:get package (app) version name when uninstall it 【发布时间】:2013-09-24 18:00:31 【问题描述】:当用户在设备上卸载应用程序时,我有以下广播接收器来捕获事件,从技术上讲,我正在接收带有动作 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”,这正是我要卸载的应用程序的包名。但是为什么我无法使用上面的代码获取版本名称?
(对了,上面的receiver是app卸载开始的时候触发的,是不是因为开始卸载之前系统已经移除了元数据?)
【问题讨论】:
文档说“现有的应用程序包已从设备中删除”。这可能就是 NameNotFoundException 上升的原因。 你能告诉我你是如何捕获卸载事件的吗……我需要它 【参考方案1】:但是为什么我无法使用上面的代码获取版本名称?
您会注意到操作名称 (ACTION_PACKAGE_REMOVED
) 是过去式。操作名称不是ACTION_PACKAGE_REMOVING
、ACTION_PACKAGE_WILL_BE_REMOVED_IN_THE_FUTURE
或ACTION_PACKAGE_USER_WANTS_TO_REMOVE_THIS_PACKAGE_WHICH_WE_WILL_DO_ANY_MINUTE_NOW
。
The documentation 也使用过去时:
现有应用程序包已从设备中删除。
因此,如果正在卸载应用程序,则在发送此广播时,该应用程序在设备上不存在,因此将无法通过PackageManager
使用。
【讨论】:
但是我是否可以收到其他广播意图,我知道应用程序将被卸载,以便我仍然可以访问包版本名称?或任何解决方法? @Mellon:“但是还有其他广播意图吗……”——与卸载无关。 “或者有什么解决办法?” -- 因为我不知道真正的业务问题是什么,所以我无法提出解决方法。尝试确定设备上不再存在的应用的版本名称有什么意义?【参考方案2】:试试这个代码来获取被卸载应用的包名:
Uri uri = intent.getData();
String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
System.out.println("Pakcge Removed: " + pkg);
【讨论】:
【参考方案3】:你可以使用这个广播:
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>
【讨论】:
以上是关于卸载时获取包(应用程序)版本名称的主要内容,如果未能解决你的问题,请参考以下文章