如何将设备所有者设置为我的android应用程序?

如何将设备所有者设置为我的android应用程序?,android,kiosk,device-owner,Android,Kiosk,Device Owner,我尝试使用以下命令将我的应用程序设置为平板电脑的设备所有者(无ROOT或NFC): adb shell dpm set-device-owner com.test.my_device_owner_app/.MyDeviceAdminReceiver 很多网站上都写着like(因为我必须制作一个KIOSK应用程序)。首先,我进行了工厂重置,然后安装了我的应用程序,然后在shell上编写了此命令,但答案是: java.lang.IllegalStateException:尝试设置设备所有者,但未设

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

adb shell dpm set-device-owner com.test.my_device_owner_app/.MyDeviceAdminReceiver
很多网站上都写着like(因为我必须制作一个KIOSK应用程序)。首先,我进行了工厂重置,然后安装了我的应用程序,然后在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(本机方法)
  位于com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)


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

我对联想瑜伽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.");
    }
下面是允许设置设备所有者设备的
实现

/**
 * 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;
    }
}
因此,首先确保所有帐户都已删除。检查设置>帐户。默认情况下,Lenovos bloat ware已创建本地日历帐户。你必须移除它

适用于具有root访问权限的用户

看。正如我从实现中看到的,dpm正在做与答案中描述的相同的事情。顺便说一下,我保留name属性没有问题

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

settings put global device_provisioned 0
我对瑜伽平板电脑的体验

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

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

更新

我有另一个瑜珈2平板电脑,没有根访问权限,也没有使用我的谷歌帐户登录,并且已经成功设置了设备所有者


有人认为我可以推荐你:在安装你的kiosk模式应用程序后,尝试关闭Android Studio。可能这会导致另一个
Binder.getCallingUid()

您找到解决问题的方法了吗?我有联想a10-30。似乎联想在安装过程中创建了一个隐藏帐户,所以它说设备已经配置好了。没有……目前我还无法在这台平板电脑上设置设备的所有者。