Вопрос по android – Удалить мое приложение программно (Android)

14

Я хочу удалить свое приложение по нажатию кнопки. Для этого я использую следующий код.

Uri packageURI = Uri.parse("package:"+packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);

Это дает мне результат, но я хочу удалить напрямую, не нажимая на кнопку "ОК" кнопка диалога с сообщением "Это приложение будет удалено".

Я просто хочу удалить приложение напрямую.

Я думаю, вам следует отступить и подумать, почему вы все равно захотите это сделать. Зачем вам нужно переопределить стандартный метод удаления приложения? kcoppock
@amity Просто выполните командуsu и в рамках этого процесса у вас есть привилегии root:Process p = Runtime.getRuntime().exec("su"); Видеть этоblog пост для полного примера. xDragonZ
Подобные вещи зарезервированы для системных приложений по уважительным причинам, так что вы застряли с рутированием своего устройства. Jens
Для этого вам нужно иметь разрешение root. xDragonZ
@xDragonZ У вас есть идеи, как получить права root? о рутировании устройства вы можете рассказать мне, как кодировать рутированное устройство. amity

Ваш Ответ

3   ответа
1

PackageInstaller, Я бы порекомендовал вам обновить весь код, который вы используете.

Следующим шагом является проверкаPackageInstaller который является нормальным классом. Вы найдете этоuninstall функционировать там. Плохая новость в том, что это необходимоManifest.permission.DELETE_PACKAGES разрешение и только для системных приложений. Это означает, что это не доступно напрямую другим разработчикам. Но мы можем получить к нему доступ с разрешения владельца устройства.

Это требует:

Android 6.0 or newer Device owner permission to uninstall the package

Как правило,DELETE_PACKAGES разрешение говорит:

Allows an application to delete packages.

Not for use by third-party applications.

Как только ваше приложение получит разрешение владельца устройства, вы можете удалить такой пакет:

String appPackage = "com.your.app.package";
Intent intent = new Intent(getApplicationContext(), 
getApplicationContext().getClass()); //getActivity() is undefined!
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
PackageInstaller mPackageInstaller = 
getActivity().getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall(appPackage, sender.getIntentSender());

Используемый код доступен здесь:

PackageInstaller & quot; Тихая установка и удаление приложений владельцем устройства & # x201D; - Android M Preview

0

можно удалить пакет в Android. Кроме того, вы также можете пропустить запрос пользователя нажать кнопку ОК на экране удаления. Вы можете сделать это с помощью службы специальных возможностей в Android.

public class MyAccessibilityService extends AccessibilityService {
    private static final String TAG = MyAccessibilityService.class
            .getSimpleName();

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.i(TAG, "ACC::onAccessibilityEvent: " + event.getEventType());

        //TYPE_WINDOW_STATE_CHANGED == 32
        if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event
                .getEventType()) {
            AccessibilityNodeInfo nodeInfo = event.getSource();
            Log.i(TAG, "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo);
            if (nodeInfo == null) {
                return;
            }

            List<AccessibilityNodeInfo> list = nodeInfo
                    .findAccessibilityNodeInfosByViewId("com.android.settings:id/left_button");
            for (AccessibilityNodeInfo node : list) {
                Log.i(TAG, "ACC::onAccessibilityEvent: left_button " + node);
                node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }

            list = nodeInfo
                    .findAccessibilityNodeInfosByViewId("android:id/button1");
            for (AccessibilityNodeInfo node : list) {
                Log.i(TAG, "ACC::onAccessibilityEvent: button1 " + node);
                node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
        }

    }

    @Override
    public void onServiceConnected() {
        Log.i(TAG, "ACC::onServiceConnected: ");
    }

    @Override
    public void onInterrupt() {
        // TODO Auto-generated method stub

    }
}
11

ниям.

Как указывает xDragonZ, корневой процесс может грубо сделать это, буквально удаляя каталог и оставляя диспетчер пакетов, чтобы справиться с потерей, но это не очень широко развертываемое решение, поскольку AFAIK никакие устройства не поставляют с такой возможностью приложениям запускать собственный процесс корневого помощника - это рискованная модификация вторичного рынка.

Похожие вопросы