恢复出厂设置的两种方法,亲测可行

方法1

参照系统"设置"应用

1.在AndroidManifest.xml配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="com.android.settings"
        android:sharedUserId="android.uid.system"> // 配置这个才有权限发恢复出厂设置的广播

并加入权限

<uses-permission android:name="android.permission.MASTER_CLEAR" />

   似乎需要系统应用才能加该权限,做法参照"Android中修改系统时间的几种方式"



2.发送广播
Intent clearIntent = new Intent("android.intent.action.MASTER_CLEAR");
clearIntent.putExtra("isReformate", true);

getActivity().sendBroadcast(clearIntent);


方法2

设备管理器

1.清单文件配置

<receiver
            android:name="com.xzc.b14.MyDeviceAdminReceiver"
            android:description="@string/description"
            android:label="@string/device_admin"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_sample" />


            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

        </receiver>

2.MyDeviceAdminReceiver.java

空实现即可

public class MyDeviceAdminReceiver extends DeviceAdminReceiver {

}

3. xml /device_admin_sample.xml

什么需要的权限

<?xml version="1.0" encoding="UTF-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-policies>
    <limit-password />
    <watch-login />
    <reset-password />
    <force-lock />
    <wipe-data />
    <expire-password />
    <encrypted-storage />
    <disable-camera />
  </uses-policies>

</device-admin>

4.恢复出厂设置

DevicePolicyManager dm;

ComponentName cpn;

dm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);

cpn = new ComponentName(this, MyDeviceAdminReceiver.class);


if (dm.isAdminActive(cpn)) {// 判断设备管理器是否已经激活

                        // 清除数据,恢复出厂设置
// 0、或WIPE_RESET_PROTECTION_DATA.,表示只清除内部空间,不清楚SD卡的数据

// DevicePolicyManager.WIPE_EXTERNAL_STORAGE,连SD卡的一起清除

dm.wipeData(0);


} else { // 弹出界面让用户激活,

/*

可能出现 Cannot start ADD_DEVICE_ADMIN as a new task
不能在一个新的栈里面开启界面去激活
如:不能在服务里面调用激活api  

*/

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cpn);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "");
startActivity(intent);
}


猜你喜欢

转载自blog.csdn.net/qq_24451593/article/details/80621486