Android 13/14中设备管理应用wipeData触发SecurityException问题
问题:Android 13/14中DPM wipeData操作抛出SecurityException错误
已将应用正确添加为设备管理员应用,其他DPM功能(如dpm.lockNow())可正常运行,Android 10系统中wipeData操作执行正常,但在Android 13、14系统中触发异常。
错误信息
java.lang.SecurityException : User 0 can not be removed .
中文翻译:java.lang.SecurityException:无法移除用户0。
相关代码
fun wipeData() { var flags = 0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) flags = flags.or(DevicePolicyManager.WIPE_SILENTLY) if (prefs.isWipeEmbeddedSim && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) flags = flags.or(DevicePolicyManager.WIPE_EUICC) dpm?.wipeData(flags) }
原因及解决方案
核心原因
Android 13(API 33)及以上版本对设备管理员权限做了严格收紧:普通设备管理员应用不再拥有擦除主用户(User 0)数据的权限,只有具备**设备所有者(Device Owner)或配置文件所有者(Profile Owner,针对工作资料场景)**身份的应用才能执行该操作。
具体解决步骤
确认应用权限身份
- 检查当前应用是否为设备所有者/配置文件所有者:通过
dpm.isDeviceOwnerApp(packageName)或dpm.isProfileOwnerApp(packageName)判断。 - 如果只是普通设备管理员,需要通过Android Enterprise部署流程(如NFC配对、批量注册等方式)将应用升级为设备所有者。
- 检查当前应用是否为设备所有者/配置文件所有者:通过
代码适配调整
- 在调用
wipeData前增加权限校验,避免触发异常:fun wipeData(context: Context) { val packageName = context.packageName val isOwner = dpm?.isDeviceOwnerApp(packageName) == true || dpm?.isProfileOwnerApp(packageName) == true if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !isOwner) { // 无权限,处理提示逻辑,比如告知用户应用权限不足 return } var flags = 0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) flags = flags.or(DevicePolicyManager.WIPE_SILENTLY) if (prefs.isWipeEmbeddedSim && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) flags = flags.or(DevicePolicyManager.WIPE_EUICC) try { dpm?.wipeData(flags) } catch (e: SecurityException) { // 捕获异常,处理错误提示 } }
- 在调用
工作资料场景适配
如果是针对工作资料擦除,确保操作的是工作用户而非主用户,可通过dpm.getProfileOwner()获取工作用户的UserHandle,wipeData默认会处理当前所有者对应的用户,无需额外指定。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

