2011-01-25 21 views
15

Próbowałem wykonać reset do ustawień fabrycznych w systemie Android przy użyciu klasy RecoverySystem, ale dostaję błędy uprawnień, których nie mogę zastąpić, ponieważ są one uprawnieniami systemowymi. Chcę wiedzieć, czy istnieje inny sposób na przywrócenie ustawień fabrycznych?Resetowanie fabryczne Androida Programowo

+6

Ręcznie? Dlaczego aplikacja * kiedykolwiek * potrzebuje uprawnień do przywrócenia ustawień fabrycznych? – kcoppock

+10

Brzmi to naprawdę podejrzanie. Jeśli użytkownik chce przywrócić ustawienia fabryczne, może to zrobić samodzielnie. Te uprawnienia są tam z bardzo ważnego powodu. – Jems

+4

Nie wspominając już, że gdyby tak zrobiła twoja aplikacja, to i tak by zniknęła po zresetowaniu ustawień fabrycznych ... – kcoppock

Odpowiedz

0

Sugeruję, abyś wysłał użytkownika do właściwego działania ustawień i niech zrobią to sami.

Zobacz aktywność this tutorial i użyć ustawień android.provider.Settings.ACTION_PRIVACY_SETTINGS

3

To działa na wielu różnych urządzeniach próbowałem. (więcej niż 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

Nie powinno to już działać od wersji Androida 3.0. Użyj interfejsu API administratora urządzenia, aby zażądać wyczyszczenia urządzenia. – CommonsWare

11

Zdarza się, że ZWOLNIONYCH aplikacji stron trzecich można to zrobić.

Na urządzeniach w liczbie 2.2+ (w tym najnowszej wersji 4.x) musiałbyś użyć DevicePolicyManager i dołączyć uprawnienia do AndroidManifest.xml. W przypadku starszych urządzeń można użyć obcego programu ładującego kontekst, jak opisano w innej odpowiedzi.

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

    DevicePolicyManager mDPM; 
    ComponentName mDeviceAdmin; 

Na Tworzenie określić wersję Androida tam dostać i uchwyt na obiektach

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

Klasa WipeDataReceiver była klasa wdrożyć DeviceAdminReceiver, ale nie mają żadnych przesłonięcia lub aktualizacji kodu.

public static class WipeDataReceiver extends DeviceAdminReceiver { 

    } 

Po wznowieniu, na początku konieczne będzie potwierdzenie przywrócenia ustawień fabrycznych. kiedy funkcja zwraca wynik, wykona wipeData. Jeśli jest to Froyo lub mniej, możesz przeskoczyć do czasu przywrócenia ustawień fabrycznych.

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

Co oznacza "WipeDataReceiver"? – 130nk3r5

+0

Co to jest "REQUEST_CODE_ENABLE_ADMIN"? – ThomasW

+0

Co to jest REQUEST_CODE_ENABLE_ADMIN? – TapanHP

1

@TapanHP, Możesz użyć dowolnego identyfikatora tylko do obsługi wywołania wyniku aktywności.

int REQUEST_CODE_ENABLE_ADMIN = 1234;