最近在8.0系统上面调试公司自主开发的setting,发现无法恢复出厂,原来在7.1 7.0 6.0 5.1上面使用的广播已经没有效果,查阅8.0的原生Settings源码之后发现恢复出厂的代码在8.0上面已经偷偷摸摸地换成了用另外一个广播android.intent.action.FACTORY_RESET。原来如此。
特将恢复出厂的方法总结如下:
public static void startFactoryDefault(Context context) throws Exception {
if (Build.VERSION.SDK_INT < 26) {
context.sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
} else {
Intent intent = new Intent("android.intent.action.FACTORY_RESET");
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.setPackage("android");
context.sendBroadcast(intent);
}
}
PS:
注意在清单文件里面加上系统权限:
android:sharedUserId="android.uid.system"
就酱紫,老夫还需要管它什么版本号啊?!
--------------------------分割线-2019.11.12更新----------------------
最近方案SDK更新到了9.0,实际测试验证无需改动代码,保持跟8.0一样的逻辑即可实现恢复出厂设置。查阅9.0的Settings源码后发现,9.0跟8.0恢复出厂设置是一样的逻辑,因此特意修改一下标题,so easy…
PS:
8.0 9.0恢复出厂部分逻辑源码如下:
MasterClearConfirm.java
//8.0
private void doMasterClear() {
Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
intent.setPackage("android");
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
intent.putExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, mEraseSdCard);
getActivity().sendBroadcast(intent);
// Intent handling is asynchronous -- assume it will happen soon.
}
//9.0
private void doMasterClear() {
Intent intent = new Intent(Intent.ACTION_FACTORY_RESET);
intent.setPackage("android");
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
intent.putExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, mEraseSdCard);
intent.putExtra(Intent.EXTRA_WIPE_ESIMS, mEraseEsims);
getActivity().sendBroadcast(intent);
// Intent handling is asynchronous -- assume it will happen soon.
}
版权声明:本文为u010725171原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。