【问题标题】:How can I set device_owner to my android app?如何将 device_owner 设置为我的 android 应用程序?
【发布时间】:2017-01-02 23:52:24
【问题描述】:

我尝试使用以下命令将我的应用程序设置为平板电脑的 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.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)
在 com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
在 com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)

现在,如何在不root平板电脑的情况下解决这个问题?

【问题讨论】:

  • 你找到解决问题的方法了吗?我有联想a10-30。似乎联想在设置过程中创建了一个隐藏帐户,因此它说设备已配置。
  • nope....目前我仍然无法在此平板电脑上设置 device_owner。

标签: android kiosk device-owner


【解决方案1】:

Lenovo 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;
    }
}

所以首先要确保所有帐户都已删除。检查设置 > 帐户。 Lenovo 的膨胀软件默认创建了 Local Calendar 帐户。你必须删除它。

对于拥有 root 权限的用户

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

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

settings put global device_provisioned 0

我对瑜伽平板电脑的体验

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

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

更新

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2020-07-22
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多