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

Android IllegalStateException:如果设备已设置,则无法设置设备所有者,android,android-source,mdm,Android,Android Source,Mdm,我正在尝试使用隐藏API激活系统应用程序的设备所有者 从DevicePolicyManager方法dpm.setDeviceOwner(cmpName)。此方法正在引发illegalStateException。我也试过了 Settings.Global.putInt(context.getContentResolver(),Settings.Global.DEVICE\u配置,0)和 Settings.Secure.putInt(context.getContentResolver(),Set

我正在尝试使用隐藏API激活系统应用程序的设备所有者 从
DevicePolicyManager
方法
dpm.setDeviceOwner(cmpName)
。此方法正在引发illegalStateException。我也试过了
Settings.Global.putInt(context.getContentResolver(),Settings.Global.DEVICE\u配置,0)
Settings.Secure.putInt(context.getContentResolver(),Settings.Secure.USER\u SETUP\u COMPLETE,0)。但是android studio仍然抛出了一个错误


注意:我在清单

中都有权限,我在
dpm.setActiveAdmin
之前调用
dpm.setProfileOwner
时收到了该错误;毕竟,配置文件所有者必须首先是活动管理员。但是,您很快就会发现,即使您发出了适当的命令序列,您也会收到错误:
java.lang.IllegalStateException:无法设置非默认配置文件所有者post setup

不过,如果你检查一下日志,我想你也会发现一个类似于我收到的警告:
avc:denied{write}for name=“com.myorg.mapp-0AMhJFjDAJrJ-KmxrLiEPA=”dev=“dm-3”ino=3558 scontext=u:r:system\u app:s0tcontext=u:object\r:apk\u数据文件:s0tclass=dir permissive=0

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

总之,你运气不好。您有几个变通方法选项:

  • 从根shell中运行
    dpm set profile owner
    命令。由于它以root用户身份运行,因此将绕过selinux规则。这是快速测试的一个很好的选择
  • 授予您的应用程序根用户访问权限以直接执行命令。如果您知道您的设备将被根化,并且不想记住命令,那么这是一个很好的选择
  • 使用已经烘焙的相关access xml文件编译ROM

如果您正在构建一个系统应用程序(您必须拥有这些权限),那么您几乎肯定是根用户或构建ROM,因此上面的一个选项应该可以工作。

虽然已经晚了,但您的答案非常有用。我们使用第三种选择来实现我们的目标。谢谢