如何将device_owner设置为我的Android应用程序?

时间:2016-08-26 10:25:22

标签: android kiosk device-owner

我尝试使用以下命令将我的应用程序设置为平板电脑的device_owner(没有ROOT或NFC):

adb shell dpm set-device-owner com.test.my_device_owner_app/.MyDeviceAdminReceiver
喜欢写在许多网站上(因为我必须制作一个KIOSK APP)。首先我重置工厂,然后我安装了我的应用程序,然后我在shell上写了这个命令,但答案是:

  

java.lang.IllegalStateException:尝试设置设备所有者但设备   已经配置。
  在android.os.Parcel.readException(Parcel.java:1554)
  在android.os.Parcel.readException(Parcel.java:1499)
  在android.app.admin.IDevicePolicyManager $ Stub $ Proxy.setDeviceOwner(IDevicePolicyManager.java:3212)
  在com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:114)
  在com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
  在com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
  在com.android.commands.dpm.Dpm.main(Dpm.java:38)
  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
  在com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)

现在,我怎样才能解决这个问题而无需支持平板电脑?

1 个答案:

答案 0 :(得分:0)

我在联想瑜伽2平板电脑上遇到了同样的问题。

以下是我在研究这个问题时发现的dpm源码。

from os import listdir
for file in listdir(<your directory>):
  #if you have to be more selective inside your directory
  #just add a conditional to skip here
  with open(file, "rb"):
    tree = ET.parse(data)
    lst_jugador = tree.findall('data_panel/players/player')
    for jugador in lst_jugador:
        print (jugador.find('name').text, jugador.get("id"))

这是 if (!allowedToSetDeviceOwnerOnDevice()) { throw new IllegalStateException( "Trying to set device owner but device is already provisioned."); } if (mDeviceOwner != null && mDeviceOwner.hasDeviceOwner()) { throw new IllegalStateException( "Trying to set device owner but device owner is already set."); } 实现

allowedToSetDeviceOwnerOnDevice

首先确保删除所有帐户。检查设置&gt;帐户。 Lenovos膨胀软件默认创建了本地日历帐户。你必须删除它。

对于有root权限的人

请参阅SO answer for manually creating the device_owner.xml。正如我从实现中看到的那样,dpm正在做与答案中描述的相同的事情。顺便说一句,我保留name属性没有问题。

当您查看/** * Device owner can only be set on an unprovisioned device, unless it was initiated by "adb", in * which case we allow it if no account is associated with the device. */ private boolean allowedToSetDeviceOwnerOnDevice() { int callingId = Binder.getCallingUid(); if (callingId == Process.SHELL_UID || callingId == Process.ROOT_UID) { return AccountManager.get(mContext).getAccounts().length == 0; } else { return Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) == 0; } } 案例时,可以通过调用

来绕过测试
else

我使用瑜伽片的经历

即使我有root访问权限,重置工厂并尝试使用device_owner.xml方法,我昨天也没有成功。

我今天所做的是使用Google帐户登录(昨天我已跳过此部分),并在设置&gt;中删除此帐户后帐户我能够(作为 su )成功运行settings put global device_provisioned 0 命令。

<强>更新

我还有另一台没有root权限的Yoga 2平板电脑,没有使用我的Google帐户登录,并成功设置了设备所有者。

有人认为我可以推荐你:在安装自助服务终端模式应用后尝试关闭Android Studio。也许这会导致另一个dpm