0

我想从设备中静默删除应用程序。我正在尝试此代码,但给出异常“用户 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});


}
4

2 回答 2

1

以编程方式静默删除 Android 应用程序是不可能的

您可以做的最好的事情是要求用户在对话框中删除应用程序。当他按下“OK”然后重定向到指向该应用程序的卸载程序应用程序。如果要完成删除操作,仍然是用户的选择。

有一种方法可以坚持用户完成删除操作,但比较看好。在他关闭卸载程序应用程序后,他将返回到您的 Activity 中onActivityResult()。您可以检查该应用程序是否被删除。如果尚未删除,您可以返回同一个对话框并再次要求他删除该应用程序。如果您选择直到用户最终删除应用程序或停止使用您的主应用程序(即您告诉用户在他删除另一个应用程序之前他不能使用您的应用程序),您可以继续这个无限循环。

如何检查是否安装了应用程序

final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);

如果抛出info==nullor 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);
于 2013-03-21T06:32:53.730 回答
1

SDK 应用程序不能拥有DELETE_PACKAGES权限,除非它们是固件的一部分。这意味着未使用固件编译的应用程序没有/获取静默删除应用程序的权利..

查看这篇文章了解更多信息..

于 2013-03-21T06:29:02.490 回答