在android中默默卸载app?

时间:2013-03-21 06:26:04

标签: android uninstall

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


}

2 个答案:

答案 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==nullNameNotFoundException,则表示未安装该应用。

如何启动指向应用的卸载程序

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了解更多信息..