Как я могу установить device_owner для моего приложения для Android?
Я попытался настроить приложение device_owner моего планшета (без ROOT или NFC) с помощью команды:
adb shell dpm set-device-owner com.test.my_device_owner_app/.MyDeviceAdminReceiver
как написано на многих сайтах (потому что я должен сделать приложение KIOSK). Сначала я сделал сброс к заводским настройкам, затем установил свое приложение и написал эту команду в оболочке, но ответ таков:
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)
Теперь, как я могу решить эту проблему без рута планшета?
1 ответ
У меня такая же проблема с Lenovo Yoga 2 Tablet.
Вот некоторые фрагменты источника 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 была создана учетная запись Local Calendar. Вы должны удалить это.
Для тех, у кого есть root-доступ
Смотрите ответ SO для создания вручную device_owner.xml. Как видно из реализации, dpm делает то же самое, что описано в ответе. Кстати, я оставляю атрибут name без проблем.
Когда вы смотрите в else
случай, вы можете обойти тест, позвонив
settings put global device_provisioned 0
Мой опыт работы с планшетом Yoga
Даже у меня есть root-доступ, восстановление заводских настроек и использование метода device_owner.xml, который вчера не увенчался успехом.
Сегодня я выполнил вход в систему с учетной записью Google (вчера я пропустил эту часть), а после удаления этой учетной записи в разделе "Настройки"> "Учетные записи" я смог (как su) запустить dpm
Команда успешно.
Обновить
У меня есть другой планшет Yoga 2 без рут-доступа и без входа в систему с моей учетной записью Google, и я успешно установил владельца устройства.
Думаю, я могу вам порекомендовать: попробуйте закрыть Android Studio после установки приложения в режиме киоска. Может быть, это вызывает другой Binder.getCallingUid()
,