Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Factory Reset Programmatically

Tags:

I tried to perform a factory reset in Android using the RecoverySystem class, but I get permission errors, which I can not overwrite because they are system permissions. I want to know if there is another way to perform a factory reset?

like image 711
Hank Avatar asked Jan 25 '11 21:01

Hank


3 Answers

Third party applications most DEFINITELY can do this.

On 2.2+ devices (including latest 4.x) you would have to use the DevicePolicyManager and include permissions in the AndroidManifest.xml. For older devices you can use foreign context loader as described in other answer.

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

  DevicePolicyManager mDPM;
  ComponentName mDeviceAdmin;

On Create determine there Android version and get handle on objects

    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);
    }

The WipeDataReceiver class was a class to implement DeviceAdminReceiver, but did not have any overrides or code updates.

    public static class WipeDataReceiver extends DeviceAdminReceiver {

    }

On Resume, initially the will have to confirm Factory Reset. when the Activity returns result it will perform wipeData. If it's Froyo or less, you can jump the stock factory reset activity.

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) {

    }

}
like image 99
dmacke Avatar answered Nov 08 '22 09:11

dmacke


you have to use DeviceAdministration (API 2.2 or above)

DevicePolicyManager mDPM; mDPM.wipeData(0);

See: http://developer.android.com/guide/topics/admin/device-admin.html

like image 45
GheParDo Avatar answered Nov 08 '22 08:11

GheParDo


This works on a many different devices I have tried. (more than 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);
like image 32
jhnclvr Avatar answered Nov 08 '22 07:11

jhnclvr