Android Factory Reset Программно

Я попытался выполнить factory reset в Android, используя класс RecoverySystem, но я получаю ошибки разрешения, которые я не могу перезаписать, потому что они являются системными правами. Я хочу знать, есть ли другой способ выполнить factory reset?

Ответы

Ответ 1

Сторонние приложения, наиболее подходящие для этого, могут сделать это.

На устройствах с поддержкой 2.2+ (включая последние 4.x) вам придется использовать DevicePolicyManager и включить разрешения в AndroidManifest.xml. Для более старых устройств вы можете использовать внешний загрузчик контекста, как описано в другом ответе.

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;

  DevicePolicyManager mDPM;
  ComponentName mDeviceAdmin;

В окне Создать определить версию Android и получить управление объектами

    currentAPIVersion = Build.VERSION.SDK_INT;

    if (currentAPIVersion >= android.os.Build.VERSION_CODES.FROYO) {
        //2.2+
        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
        mDeviceAdmin = new ComponentName(this, WipeDataReceiver.class);
    }

Класс WipeDataReceiver был классом для реализации DeviceAdminReceiver, но не имел никаких переопределений или обновлений кода.

    public static class WipeDataReceiver extends DeviceAdminReceiver {

    }

В разделе "Возобновить" сначала необходимо подтвердить Factory Reset. когда результат Activity возвращает результат, он будет выполнять wipeData. Если это Froyo или меньше, вы можете перейти к акции Factory reset.

if (currentAPIVersion >= android.os.Build.VERSION_CODES.FROYO) {
    // 2.2+
    if (!mDPM.isAdminActive(mDeviceAdmin)) {
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdmin);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Process will remove user installed applications, settings, wallpaper and sound settings. Are you sure you want to wipe device?");
        startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);
    } else {
        // device administrator, can do security operations
        mDPM.wipeData(0);
    }

} else {
    // 2.1
    try {
        Context foreignContext = this.createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
        Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.android.settings.MasterClear");
        Intent i = new Intent(foreignContext, yourClass);
        this.startActivityForResult(i, REQUEST_CODE_ENABLE_ADMIN);
    } catch (ClassNotFoundException e) {

    }

}

Ответ 3

Это работает на многих различных устройствах, которые я пробовал. (более 20)

Context foreignContext = createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.android.settings.MasterClear");

Intent intent = new Intent(foreignContext, yourClass);
startActivity(intent);

Ответ 4

@TapanHP, вы можете использовать любой идентификатор только для обработки обратного вызова результата активности.

int REQUEST_CODE_ENABLE_ADMIN = 1234;

Ответ 5

Я предлагаю вам отправить пользователю правильную настройку и позволить им сделать это самостоятельно.

Смотрите этот учебник и используйте действия с настройками android.provider.Settings.ACTION_PRIVACY_SETTINGS