This answer表明android应用程序可以像这样运行:

Runtime.getRuntime().exec("dpm set-device-owner com.test.my_device_owner_app");

在我运行5.1.1的Nexus4上,这会自动失败。shell返回错误代码0(成功),并且没有控制台输出。尽管取得了明显的成功,但我的应用程序并没有成为设备所有者。设备刚从出厂重置中恢复,未配置用户帐户。
作为一个控件,我尝试运行一个垃圾命令,而不是dpm。它按预期失败了。
这有用吗?是故意的书呆子吗?

最佳答案

dpm当命令语法错误时,错误退出,状态代码为0。正确的语法是dpm set-device-owner package/.ComponentName。当语法正确时,exec(...)抛出一个SecurityException

java.lang.SecurityException: Neither user 10086 nor current process has android.permission.MANAGE_DEVICE_ADMINS.
  at android.os.Parcel.readException(Parcel.java:1546)
  at android.os.Parcel.readException(Parcel.java:1499)
  at android.app.admin.IDevicePolicyManager$Stub$Proxy.setActiveAdmin(IDevicePolicyManager.java:2993)
  at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:110)
  at com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
  at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
  at com.android.commands.dpm.Dpm.main(Dpm.java:38)
  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)

将此权限添加到清单没有帮助,因此它可能是仅限系统的权限。
在没有nfc的设备上部署一个kiosk模式的应用程序已经是一件麻烦事了,因为你必须启用开发者模式并通过adb安装应用程序。我想provisioner只需要手动运行dpm

关于android - 使用Runtime.exec(...)运行dpm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30674921/

10-11 07:13