不允许设置设备所有者,因为设备上已经有多个用户

Not allowed to set the device owner because there are already several users on the device

我按照这个 tutorial 将应用程序设置为设备所有者。在该教程中,有一个部分 'Using adb to set the device owner'。这里的教程说安装 Kiosk 模式演示应用程序后,运行 以下命令:

adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver

这给了我错误:

adb server is out of date.  killing...
* daemon started successfully *
java.lang.IllegalStateException: Not allowed to set the device owner because there are already several users on the device
    at android.os.Parcel.readException(Parcel.java:1629)
    at android.os.Parcel.readException(Parcel.java:1574)
    at android.app.admin.IDevicePolicyManager$Stub$Proxy.setDeviceOwner(IDevicePolicyManager.java:5146)
    at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:114)
    at com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.dpm.Dpm.main(Dpm.java:38)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:257)

我遵循了这个 SO link 并且 Diego Plascencia Lara 的回答帮助我摆脱了

adb server is out of date.  killing...
* daemon started successfully *

但是在运行执行adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver命令后仍然出现以下错误:

java.lang.IllegalStateException: Not allowed to set the device owner because there are already several users on the device
    at android.os.Parcel.readException(Parcel.java:1629)
    at android.os.Parcel.readException(Parcel.java:1574)
    at android.app.admin.IDevicePolicyManager$Stub$Proxy.setDeviceOwner(IDevicePolicyManager.java:5146)
    at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:114)
    at com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.dpm.Dpm.main(Dpm.java:38)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:257)

为什么会出现这个错误,我该如何删除它?我之前曾尝试将不同的应用程序设置为设备所有者,但我认为我没有设法将它们完全关闭,并且在完成在设备上获取应用程序 运行ning 的整个过程时总是会出现一些错误。

这篇 post 对 dpm 命令进行了很好的概述: http://florent-dupont.blogspot.fr/2015/01/android-shell-command-dpm-device-policy.html

在 post 接近尾声时,添加了此更新: “设备所有者只能在未配置的设备上设置,除非它是由“adb”启动的,在这种情况下,如果没有帐户与设备关联,我们允许它”源代码说。所以,确保在使用 dpm 命令"

之前,您没有与当前用户集相关联的任何帐户(如 Gmail)

我建议使用 dpm 安装您的应用并将其设置为设备所有者 执行恢复出厂设置后,通过 Google 向导而不设置任何帐户,启用开发人员从设置模式,最后启用 "USB debugging"...如果这对您来说是一个可行的选择...

有一种方法可以在不恢复出厂设置的情况下解决此问题。只需从您的设备中删除所有帐户(在“设置”->“帐户”中)。您可能希望在执行此操作之前同步数据,以便稍后可以恢复它们。删除所有帐户后,将您的 phone 连接到计算机并 运行 命令:

adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver

如果您收到这样的消息:

Success: Device owner set to package ComponentInfo{org.bluetooth.bledemo/org.bluetooth.bledemo.AdminReceiver}
Active admin set to component {org.bluetooth.bledemo/org.bluetooth.bledemo.AdminReceiver}

认为自己很成功。现在您可以重新添加之前删除的所有帐户。

另一种方式:正如 Steve Miskovetz 在回答中指出的那样,恢复出厂设置是将应用程序设置为设备所有者的方法之一,如果之前,您的 phone 有帐户(例如 Gmail 帐户)。但是在 Android and/or 一些 phone 的最新版本中,在恢复出厂设置后,除非您设置了 google 帐户,否则它们不允许继续前进。因此,为了解决这个问题,请继续注册您的 google 帐户,当您的 phone 恢复正常操作状态时,通过进入设置 -> 帐户删除该帐户。现在你只需要enable developer mode and then USB debugging。之后将您的 phone 连接到计算机并 运行 命令 adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver.

我在使用模拟器时遇到了同样的问题。 然后在 Android 工作室的 AVD 管理器中,我右键单击设备 -> 擦除数据。

我知道这是 4 年前的 post 但我遇到了同样的问题而且我不想恢复出厂设置所以我点击了它然后你会得到确认屏幕显示您已安装的所有内容以及仍在登录的帐户,即使它们未显示在帐户和备份下。

然后您可以继续删除这些应用程序,一切就绪!

*在我的例子中,仍然登录的应用程序是 reddit 和 zoho invoice

按照以下说明解决问题:

  1. 在设置->账户中删除所有账户
  2. 使用命令:adb shell dumpsys account(它会列出所有剩余的帐户,但之前没有列出,卸载所有应用程序)
  3. 再试一次