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」を押すと、アプリケーションを指すアンインストーラーアプリケーションにリダイレクトします。削除操作を完了したい場合は、ユーザーが選択できます。

ユーザーが削除操作を終了するように主張する方法はありますが、それはかなり強気です。アンインストーラアプリケーションを閉じた後、のアクティビティに戻りますonActivityResult()。アプリが削除されているかどうかを確認できます。まだ削除されていない場合は、同じダイアログに戻って、アプリケーションを削除するようにもう一度依頼することができます。ユーザーが最終的にアプリを削除するか、メインアプリケーションの使用を停止するまで(つまり、他のアプリを削除するまでアプリを使用できないことをユーザーに伝えている場合)、この無限のループを続けることができます。

アプリがインストールされているかどうかを確認する方法

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);
于 2013-03-21T06:32:53.730 に答える
1

SDK アプリケーションはDELETE_PACKAGES、ファームウェアの一部でない限り、アクセス許可を持つことはできません。つまり、ファームウェアでコンパイルされていないアプリには、アプリをサイレント モードで削除する権利がありません。

詳細については、この投稿をご覧ください。

于 2013-03-21T06:29:02.490 に答える