如何让我的应用成为设备所有者?

时间:2014-01-17 10:18:35

标签: android device-admin

device policy manager API docsandroid 5.0 overview都提到了设备所有者应用的内容。如何将我的应用设置为设备所有者

编辑: 除了root和NFC之外还有其他方法吗?请分享。

5 个答案:

答案 0 :(得分:53)

实际上,除了NFC和root用户之外,还有一种方法可以将应用程序设置为设备所有者应用。 您可以使用adb shell中的 dpm 命令行工具。

用法:

usage: dpm [subcommand] [options]
usage: dpm set-device-owner <COMPONENT>
usage: dpm set-profile-owner <COMPONENT> <USER_ID>

dpm set-device-owner: Sets the given component as active admin, and its package as device owner.
dpm set-profile-owner: Sets the given component as active admin and profile owner for an existing user.

更新: dpm实用程序实际上非常简单。其目标是在device_owner.xml下创建一个名为/data/system/device_owner.xml的新文件,该文件引用设备/配置文件所有者应用。

Android平台随后会读取此文件以检查哪个应用程序被视为设备所有者配置文件所有者应用

在root设备上,您确实可以create this file by yourself,但由于dpm工具正在执行此操作,因此您最好使用它(DRY原则):

例如通过Runtime.exec()命令:

Runtime.getRuntime().exec("dpm set-device-owner com.foo.deviceowner/.DeviceAdminRcvr");

另请注意,只有在用户未设置帐户(确保在设置&gt;帐户中未设置帐户)之前,此工具才有效。

来自Android shell command tool : Device Policy Manager

来源和更多信息

答案 1 :(得分:13)

如果您是设备上的root用户,则可以按照此方法成为设备所有者。

首先,创建一个包含以下内容的文件device_owner.xml

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<device-owner package="your.owner.app.package.id" name="Your app name" />

现在执行以下步骤

  1. adb push device_owner.xml /sdcard/

  2. adb shell

  3. su

  4. cp /sdcard/device_owner.xml /data/system/

  5. cd /data/system/

  6. chown system:system device_owner.xml

  7. 重新启动

  8. 注意:在重新启动设备之前,请确保已安装了您尝试设备所有者的应用程序。如果你不这样做,你将获得无限时间的启动动画。

答案 2 :(得分:0)

更新:

在我的Android 7.1.2机顶盒(AOSF和root)上,我发现了一些随着时间的推移而发展的事情。

    除非在AndroidManifest.xml中声明exec("dpm set-device-owner ..."),否则
  1. <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />抛出异常。但这带来了其他问题,更多关于here
  2. 文件/data/system/device_policy.xml不再出现。相反,它现在是/data/system/device_policy_2.xml,架构略有不同。通过adb shell运行dpm set-device-owner com.myDomain.myPackage/.myComponent会生成以下文件:
  3. <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
    <root>
        <device-owner package="com.myDomain.myPackage" name="" component="com.myDomain.myPackage/com.myDomain.myPackage.myComponent" userRestrictionsMigrated="true" />
    </root>
    

答案 3 :(得分:0)

您还可以通过调用SDK文档中隐藏的名为DevicePolicyManager的{​​{1}}方法来使用自反性。

别忘了取消它,否则你会与Google Play发生冲突;)

答案 4 :(得分:-1)

刚试过,dpm命令需要在真实设备上拥有root权限(例如Samsung T550),否则它将失败SecurityExceptionadb shell仅在Android模拟器上授予root权限。所以你必须首先根设备。