Столкнулся с интересной ситуацией, не знаю как решить. Когда пользователь впервые входит в мое приложение в качестве пользователя Android for Work, я обязан убедиться, что приложение зарегистрировано в качестве диспетчера устройств. Я проверяю, так ли это, вызывая DevicePolicyManager#isAdminActive
, и если это возвращает false
, то я запускаю Intent
с action=DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN
, чтобы запустить элемент управления Android, который позволит управлять устройством. Как только это произошло, когда мое приложение снова запускается (или когда оно возвращается из потока управления устройством), значение DevicePolicyManager#isAdminActive
проверяется снова. Если пользователь включил управление устройством, то все в порядке, и приложение продолжает свой путь.
Интересно, что это работает именно так, как и ожидалось, когда пользователь впервые проходит через наш поток. К сожалению, после перезагрузки, когда пользователь запускает мое приложение, оно проверяет, включено ли управление устройством через DevicePolicyManager#isAdminActive
, и здесь становится интересно. DevicePolicyManager#isAdminActive
сообщит false
, что подтверждается просмотром настроек безопасности устройства. Однако, что еще хуже, попытка включить управление устройствами приведет к следующему исключению:
W/DeviceAdminAdd: исключение, пытающееся активировать администратора 1550) в android.os.Parcel.readException(Parcel.java:1499) в android.app.enterprise.IEnterpriseDeviceManager$Stub$Proxy.setActiveAdmin(IEnterpriseDeviceManager.java:867) в android.app.enterprise.EnterpriseDeviceManager.setActiveAdmin(EnterpriseDeviceManager .java:720) в com.android.settings.DeviceAdminAdd.addAndFinish(DeviceAdminAdd.java:346) в com.android.settings.DeviceAdminAdd$3.onClick(DeviceAdminAdd.java:313) в android.view.View.performClick(View .java:5242) в android.widget.TextView.performClick(TextView.java:10571) в android.view.View$PerformClick.run(View.java:21196) в android.os.Handler.handleCallback(Handler.java: 739) на android.os.Handler.dispatchMessage(Handler.java:95) на android.os.Looper.loop(Looper.java:145) на android.app.ActivityThread.main(ActivityThread.java:6938) на java.lang. Reflect.Method.invoke(собственный метод) в java.lang.reflect.Method.invoke(Method.java:372) в...
Это точное исключение появляется в моей консоли logcat, даже когда я пытаюсь вручную включить управление устройством через страницу настроек безопасности системы, поэтому я не думаю, что исходный Intent
искажен.
Итак, вот моя проблема: один вызов API управления устройствами Android говорит мне, что мой администратор устройства не активирован, но другой вызов того же API говорит мне, что это так. Я считаю, что второй на самом деле ошибочен, но без возможности активировать администрацию мой пользователь застрял в цикле и не может использовать мое приложение.
Кто-нибудь еще сталкивался с этой ошибкой, и если да, то как вы ее кодируете?
isAdminActive()
. На каком устройстве вы тестируете? - person CommonsWare   schedule 02.02.2018