2013-03-21 69 views
0

我想从设备中静默删除应用程序。 我想这个代码,但给出异常“既不是用户10051也不是当前进程有android.permission.DELETE_PACKAGES。”在android中默默卸载应用程序?

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

SDK应用程序不能拥有DELETE_PACKAGES权限,除非它们是固件的一部分。这意味着,不与固件编译的应用程序没有/收购权默默地删除应用..

退房this post更多信息..

+0

怎么样,而不需要“批量卸载程序”的工作应用服务,系统应用程序吗?他们是否实际上做了uninsalling所需的相同操作,而不是使用“adb uninstall”? – 2013-03-21 20:30:57

+0

这是从那里玩商店页面“只有ROOT电话或ROOT权利的电话可以执行静音卸载,不会弹出任何对话框,并且不需要重复确认。只需一次触摸批量卸载。没有ROOT的电话将需要在系统界面中重复选择“。 https://play.google.com/store/apps/details?id=cn.menue.BatchUninstall&hl=zh-CN – 2013-03-22 05:05:00

+0

所以,当我说固件编译它意味着应用程序与根.... – 2013-03-22 05:05:39

1

这是不可能悄无声息程序删除Android应用

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

有一种方法可以坚持用户完成删除操作,但它是非常乐观的。在他关闭卸载程序后,他将返回到您的活动onActivityResult()。您可以检查该应用是否被删除。如果它还没有被删除,你可以返回到同一个对话框并再次请他删除该应用程序。如果您选择,直到用户最终删除应用程序或停止使用主应用程序(即,您告诉用户在他删除其他应用程序之前他不能使用您的应用程序),您可以继续进行无限循环。

如何检查是否一个应用程序被安装

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); 
+0

“如果info == null ...”不是true,则从不从getPackageInfo返回null。 – 2013-12-11 09:03:11