2013-03-21 14 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