IllegalStateException:如果设备已经设置,则无法设置设备所有者

IllegalStateException: Cannot set the device owner if the device is already set-up

我正在尝试使用隐藏 API 激活我的系统应用程序的设备所有者 来自 DevicePolicyManager 方法 dpm.setDeviceOwner(cmpName)。此方法抛出 illegalStateException。我也试过 Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0);Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 0);。但是 android studio 仍然报错。

注意 :我在清单 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /><uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" />

中都有权限

我在 dpm.setActiveAdmin 之前调用 dpm.setProfileOwner 时收到该错误;毕竟,配置文件所有者必须首先是活跃的管理员。但是,您很快就会发现,即使您发出了适当的命令序列,您也会收到错误:java.lang.IllegalStateException: Unable to set non-default profile owner post-setup.

不过,如果您检查 logcat,我怀疑您还会发现一条类似于我收到的警告:avc: denied { write } for name="com.myorg.mapp-0AMhJFjDAJrJ-KmxrLiEPA==" dev="dm-3" ino=3558 scontext=u:r:system_app:s0 tcontext=u:object_r:apk_data_file:s0 tclass=dir permissive=0

这条消息是关键...问题是 selinux 规则阻止 apk 直接更改 /data/system 目录,这是 xml 文件(device_owner_2.xml 和 device_policies.xml) 定义配置文件所有权。

简而言之,你运气不好。您有几个解决方法:

  • 运行 来自 root shell 的 dpm set-profile-owner 命令。因为它是 运行 作为 root 这将绕过 selinux 规则。这是快速测试的绝佳选择
  • 授予您的应用程序根访问权限以直接执行命令。如果您知道您的设备将被 root 并且不想记住命令,这是一个不错的选择。
  • 使用已经内置的相关访问 xml 文件编译您的 ROM。

如果您正在构建一个系统应用程序(您必须拥有这些权限),您几乎可以肯定已经获得 root 权限或构建了一个 ROM,因此上述选项之一应该有效。