2011-01-25 19 views
15

He intentado realizar un restablecimiento de fábrica en Android utilizando la clase RecoverySystem, pero obtengo errores de permiso, que no puedo sobrescribir porque son permisos del sistema. Quiero saber si hay otra forma de realizar un restablecimiento de fábrica?Android Factory Reset Programmatically

+6

¿Manualmente? ¿Por qué una aplicación * alguna vez * necesita permiso para realizar un restablecimiento de fábrica? – kcoppock

+10

Esto suena realmente dudoso. Si un usuario quiere un restablecimiento de fábrica, puede hacerlo por sí mismo. Esos permisos están ahí por una muy buena razón. – Jems

+4

Sin mencionar, si su aplicación hizo esto, también desaparecería después de la restauración de fábrica de todos modos ... – kcoppock

Respuesta

0

Te sugiero que envíes al usuario a la actividad de configuración adecuada y les permitas que lo hagan ellos mismos.

Véase la actividad this tutorial y utilizan los ajustes android.provider.Settings.ACTION_PRIVACY_SETTINGS

3

Esto funciona en una gran variedad de dispositivos que he probado. (más de 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

Esto ya no debería funcionar alrededor de Android 3.0. Use las API de administración del dispositivo para solicitar un borrado del dispositivo. – CommonsWare

11

Las aplicaciones de terceros más DEFINITELY pueden hacerlo.

En 2.2+ dispositivos (incluidos los últimos 4.x) tendría que usar DevicePolicyManager e incluir permisos en el archivo AndroidManifest.xml. Para dispositivos más antiguos, puede usar el cargador de contexto externo como se describe en otra respuesta.

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

    DevicePolicyManager mDPM; 
    ComponentName mDeviceAdmin; 

En Crear determinar existe versión para Android y conseguir manejar en objetos

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

La clase WipeDataReceiver era una clase para implementar DeviceAdminReceiver, pero no tenía ningún anulaciones o cambios de código.

public static class WipeDataReceiver extends DeviceAdminReceiver { 

    } 

Al reiniciar, inicialmente tendrá que confirmar la restauración de fábrica. cuando el resultado de la actividad devuelve, realizará wipeData. Si es Froyo o menos, puede saltar la actividad de reinicio de fábrica.

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

    } 

} 
+0

¿A qué se refiere "WipeDataReceiver"? – 130nk3r5

+0

¿Qué es 'REQUEST_CODE_ENABLE_ADMIN'? – ThomasW

+0

¿Qué es REQUEST_CODE_ENABLE_ADMIN? – TapanHP

1

@TapanHP, Puede usar cualquier ID solo para manejar la devolución de llamada de resultado de la actividad.

int REQUEST_CODE_ENABLE_ADMIN = 1234;