67

设备策略管理器API 文档android 5.0 概述都提到了有关设备所有者应用程序的内容。如何将我的应用设置为设备所有者

编辑:如果有的话,除了root和NFC还有其他方法吗,请分享。

4

5 回答 5

72

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

用法 :

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 平台将读取此文件以检查哪个应用程序被视为Device OwnerProfile Owner App

在有根设备上,您确实可以自己创建此文件,但由于该dpm工具正在执行此操作,因此您最好使用它(DRY 原则):

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

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

另请注意,此工具仅在使用前未为用户设置帐户(确保在Settings > Accounts中未设置帐户)时才有效。

Android shell 命令工具来源和更多信息:设备策略管理器

于 2015-01-12T19:28:26.633 回答
19

如果您是设备的 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. 重启

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

于 2014-11-10T08:26:59.607 回答
1

更新:

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

  1. exec("dpm set-device-owner ...")抛出和异常,除非<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />在 AndroidManifest.xml 中声明。但这带来了其他问题,更多关于这里的内容。
  2. 该文件/data/system/device_policy.xml不再出现。相反,它现在/data/system/device_policy_2.xml和架构略有不同。dpm set-device-owner com.myDomain.myPackage/.myComponent通过 adb shell运行生成的文件为:
<?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>
于 2018-01-14T00:44:31.780 回答
-2

您还可以通过调用隐藏在 SDK 文档中的DevicePolicyManager方法来使用反射性。setProfileOwner

不要忘记取消它,否则您会与 Google Play 发生冲突;)

于 2018-02-14T13:27:36.657 回答
-4

刚试过,该dpm命令需要真机上的root权限(例如三星T550),否则会失败SecurityExceptionadb shell仅在 android 模拟器上授予 root 权限。所以你必须先root设备。

于 2016-05-14T15:58:20.227 回答