2011-01-25 9 views
15

AndroidでRecoverySystemクラスを使用して工場出荷時のリセットを実行しようとしましたが、システム権限であるため上書きできないパーミッションエラーが発生します。工場のリセットを行う別の方法があるかどうかを知りたいですか?Android Factory Reset Programm

+6

手動?なぜアプリは*工場出荷時のリセットを実行する権限を必要としますか? – kcoppock

+10

これは本当に面倒なようです。ユーザーが工場出荷時のリセットを望む場合は、それ自体で行うことができます。これらのアクセス許可は非常に良い理由のためにそこにあります。 – Jems

+4

あなたのアプリがこれをしていれば、工場リセット後も消えてしまうでしょう... – kcoppock

答えて

0

ユーザーを適切な設定アクティビティに送信して、自分で行うことをお勧めします。

あなたはDeviceAdministration(上記API 2.2または)

DevicePolicyManager mDPMを使用する必要がandroid.provider.Settings.ACTION_PRIVACY_SETTINGS

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

これはAndroid 3.0を中心に動作しなくなります。デバイスのワイプを要求するには、デバイスの管理APIを使用します。 – CommonsWare

11

第三者のアプリケーションで最も可能なのはこれです。

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 { 

    } 

再開時には、最初に工場出荷時リセットを確認する必要があります。アクティビティが結果を返すと、wipeDataが実行されます。 Froyo以下であれば、在庫工場のリセット活動を飛び越すことができます。

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

「WipeDataReceiver」とは何ですか? – 130nk3r5

+0

'REQUEST_CODE_ENABLE_ADMIN'とは何ですか? – ThomasW

+0

REQUEST_CODE_ENABLE_ADMINとは何ですか? – TapanHP

1

@TapanHP、あなたは活動結果のコールバックを処理するだけで任意のIDを使用することができます。

int REQUEST_CODE_ENABLE_ADMIN = 1234;