使用Runtime.exec运行dpm(...)

时间:2015-06-05 20:05:27

标签: android kiosk-mode android-5.1.1-lollipop

This answer表示Android应用可以像这样运行dpm

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

这在运行5.1.1的Nexus 4上无声地失败。 shell返回错误代码0(成功),并且没有控制台输出。尽管取得了明显的成功,但我的应用程序并未成为设备所有者。出厂时已重置设备,未配置用户帐户。

作为控件,我尝试运行垃圾命令而不是dpm。它按预期失败了。

这有用吗?是故意伤害了吗?

1 个答案:

答案 0 :(得分:1)

当命令语法错误时,

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的设备上部署自助服务终端模式应用程序已经很痛苦,因为您必须启用开发人员模式并通过adb安装应用程序。我想配置程序只需要手动运行dpm