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

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

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

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

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

 xDragonZ14 июн. 2012 г., 14:33
@amity Просто выполните командуsu и в рамках этого процесса у вас есть привилегии root:Process p = Runtime.getRuntime().exec("su"); Видеть этоblog пост для полного примера.
 Jens07 мая 2012 г., 16:07
Подобные вещи зарезервированы для системных приложений по уважительным причинам, так что вы застряли с рутированием своего устройства.
 xDragonZ07 мая 2012 г., 16:06
Для этого вам нужно иметь разрешение root.
 amity08 июн. 2012 г., 09:10
@xDragonZ У вас есть идеи, как получить права root? о рутировании устройства вы можете рассказать мне, как кодировать рутированное устройство.
 kcoppock07 мая 2012 г., 16:38
Я думаю, вам следует отступить и подумать, почему вы все равно захотите это сделать. Зачем вам нужно переопределить стандартный метод удаления приложения?

Ответы на вопрос(3)

ниям.

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

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

можно удалить пакет в 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

    }
}

Ваш ответ на вопрос