【问题标题】:How to make my app a device owner?如何让我的应用成为设备所有者?
【发布时间】:2014-02-06 15:09:41
【问题描述】:

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

编辑: 如果可以的话,除了root和NFC还有其他方法吗?

【问题讨论】:

  • 来自链接--->设备所有者应用程序是一种特殊的设备管理员,一旦激活为设备管理员,用户就无法停用。它也无法卸载。
  • 使用你应用的人应该是管理员而不是(你)开发者,所以不要以为你可以做出这样的无法卸载的应用!
  • 请阅读那里提到的关于所有者应用程序的给定链接,而不是我,我只是想知道它是怎么可能的。
  • 为了让您的应用程序成为设备所有者,无需 root 设备,请遵循 [Android 5.0(和其他)设备所有者,无需 root 设备,通过 NFC 配置设备][1] [1]:stackoverflow.com/questions/26906210/…跨度>

标签: android device-admin


【解决方案1】:

除了 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 实用程序实际上非常简单。它的目标是在/data/system/device_owner.xml 下创建一个名为device_owner.xml 的新文件,该文件引用设备/配置文件所有者 应用程序。

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

在有根设备上,你确实可以create this file by yourself,但既然dpm工具正在做,你最好使用它(DRY原则):

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

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

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

来源和更多信息Android shell command tool : Device Policy Manager

【讨论】:

  • dpm 命令的使用是通过adb shell 命令完成的,因此您首先需要配置您的设备,启用开发者模式,启用调试,将您的应用安装为通常(例如使用 Android Studio 安装),然后使用dpm 将其设置为设备所有者应用程序。您可以将命令dpm 视为一种工具,以方便您开发设备/配置文件所有者应用程序。
  • @Hartok 为什么你说这不能用于生产?任何不需要生根设备的解决方案似乎更适合生产部署。
  • 这通常是企业应用程序的安装方式。
  • 好而简短的回答对我帮助很大!我只想补充一下,还有更多未显示的实现细节,例如添加设备管理员接收器代码,这是使 dpm 命令工作所必需的。供参考。 sdgsystems.com/blog/…
  • 当我从命令行调用“adb shell dpm set-device-owner BLAH”时,一切正常(我的应用程序成为设备所有者 - 我没有收到安全异常,因为我的应用程序是系统应用程序),但是当我从我的程序中调用“Runtime.getRuntime().exec("dpm set-device-owner BLAH");”我得到一个静默失败(不是 SecurityException,尽管我希望得到一些反馈)。知道为什么吗?
【解决方案2】:

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

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

【讨论】:

  • 为设备生根请遵循:ibtimes.co.uk/…
  • 但是如果有一个(Gmail)帐户已经与设备关联,这将起作用。
  • @piyush 这与那个根本无关,无论如何都可以工作
  • @Spynet 谢谢你的最后一步,重新启动,我正在努力让它在另一个指南上运行,但没有意识到我必须重新启动才能使其生效....
  • 您好,XML格式是否正确?因为我要在我的一台设备上进行同样的测试。
【解决方案3】:

更新:

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

  1. exec("dpm set-device-owner ...") 抛出异常,除非在 AndroidManifest.xml 中声明了 &lt;uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /&gt;。但这带来了其他问题,更多关于here
  2. 文件/data/system/device_policy.xml 不再出现。相反,它现在是/data/system/device_policy_2.xml,并且架构略有不同。通过 adb shell 运行 dpm set-device-owner com.myDomain.myPackage/.myComponent 会生成文件:
<?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>

【讨论】:

    【解决方案4】:

    您还可以通过调用名为 setProfileOwnerDevicePolicyManager 方法来使用反射性,该方法隐藏在 SDK 文档中。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • OP 要求使用除“root”设备之外的方法。
      • 在 Nexus 5 上不是这样,dpm 对我来说工作正常没有 root 访问权限,我怀疑这更有可能是由于特定三星设备上的某种自定义。
      • 我遇到了同样的问题(使用相同的设备),问题不在于三星要求您根设备。需要在清单中设置三星特定权限(请参阅链接),设备所有者才能工作。我必须将权限 com.sec.enterprise.permission.CUSTOM_PROKIOSK 添加到清单中。 seap.samsung.com/html-docs/android-customization/Content/…
      • 并非所有三星设备都需要 Root 和/或特殊权限。我已经使用 adb 和通过 QR 码配置设置了设备所有者,无需特殊权限或 root。
      猜你喜欢
      • 2017-05-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多