3

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

adb shell dpm set-device-owner com.test.my_device_owner_app/.MyDeviceAdminReceiver

like 写在很多网站上(因为我必须制作一个 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.onRun(Dpm.java:82)
  在 com.android.internal.os.BaseCommand 的 com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:114)
  。在 com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) 的   com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)的
  com.android.commands.dpm.Dpm.main(Dpm.java:38)运行(BaseCommand.java:47)   。 os.RuntimeInit.main(RuntimeInit.java:249)


现在,如何在不植根平板电脑的情况下解决此问题?

4

1 回答 1

0

联想 Yoga 2 平板电脑也有同样的问题。

这是我在研究这个问题时发现的一些 dpm 源代码的片段。

    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实现

/**
 * 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;
    }
}

因此,首先确保所有帐户都已删除。检查设置 > 帐户。联想膨胀软件默认创建了本地日历帐户。你必须删除它。

对于那些有 root 访问权限的人

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

当您查看else案例时,您可以通过调用绕过测试

settings put global device_provisioned 0

我对瑜伽平板电脑的体验

即使我有 root 访问权限、恢复出厂设置并尝试了 device_owner.xml 方法,我昨天也没有成功。

我今天所做的是使用 google 帐户登录(昨天我跳过了这部分),然后在 Settings > Accounts 中删除了这个帐户后,我能够(作为su)成功运行dpm命令。

更新

我有另一台 Yoga 2 平板电脑,没有 root 访问权限,也没有使用我的谷歌帐户登录,并且已成功设置设备所有者。

有人认为我可以向您推荐:安装您的自助服务终端模式应用程序后尝试关闭 Android Studio。也许这会导致另一个Binder.getCallingUid().

于 2017-08-22T15:40:27.063 回答