我想从设备中静默删除应用程序。 我正在尝试此代码,但给出异常“用户10051和当前进程都没有android.permission.DELETE_PACKAGES。”
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) throws RemoteException {
if (onInstalledPackaged != null) {
onInstalledPackaged.packageInstalled(packageName, returnCode);
}
}
}
class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
public void packageDeleted(String packageName, int returnCode) throws RemoteException {
/*if (onInstalledPackaged != null) {
onInstalledPackaged.packageInstalled(packageName, returnCode);
}*/
}
}
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
observerdelete = new PackageDeleteObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageDeleteObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void setOnInstalledPackaged(OnInstalledPackaged onInstalledPackaged) {
this.onInstalledPackaged = onInstalledPackaged;
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observerdelete, 0});
}
答案 0 :(得分:1)
无法以编程方式静默删除Android应用。
您可以做的最好的事情是要求用户在对话框中删除该应用。当他按“OK”然后重定向到指向应用程序的Uninstaller应用程序。如果他想完成删除操作,仍然是用户的选择。
有一种方法可以坚持用户完成删除操作,但这是相当乐观的。关闭卸载程序后,他将返回onActivityResult()
中的活动。您可以查看该应用是否已删除。如果尚未删除,您可以返回相同的Dialog并再次要求他删除该应用程序。如果您选择直到用户最终删除应用程序或停止使用您的主应用程序(即您告诉用户他不能使用您的应用程序,直到他删除其他应用程序),您可以继续这个无限循环。
如何检查应用是否已安装:
final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);
如果抛出info==null
或NameNotFoundException
,则表示未安装该应用。
如何启动指向应用的卸载程序:
Uri uri = Uri.parse("package:com.company.other-app-name");
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivityForResult(intent, REQUEST_CODE_UNINSTALL_FREE_APP);
答案 1 :(得分:0)
SDK应用程序不能拥有DELETE_PACKAGES
权限,除非它们是固件的一部分。这意味着未使用固件编译的应用程序没有/无权以静默方式删除应用程序..
查看this post了解更多信息..