繁体   English   中英

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

[英]How can I set device_owner to my android app?

我尝试使用以下命令将我的应用程序设置为平板电脑的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)

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

联想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;
    }
}

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

对于那些有root权限的人

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

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

settings put global device_provisioned 0

我对瑜伽平板电脑的体验

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

我今天所做的是使用谷歌帐户登录(昨天我已跳过此部分),并在删除此设置>帐户中的帐户后我能够(作为su )成功运行dpm命令。

更新

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM