Администрирование устройства не работает

Я создал киоск-приложение и пытаюсь настроить свое устройство в качестве администратора. Всякий раз, когда я проверяю, являюсь ли я активным администратором, он возвращает false

private void provisionOwner() {
    DevicePolicyManager manager =
            (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    ComponentName componentName = BasicDeviceAdminReceiver.getComponentName(this);

    if(!manager.isAdminActive(componentName)) {
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
        startActivityForResult(intent, 0);
        return;
    }

    if (manager.isDeviceOwnerApp(getPackageName()))
        manager.setLockTaskPackages(componentName, new String [] {getPackageName()});
}

Я следовал инструкциям по выполнению сценария командной строки, прежде чем проверять, является ли устройство администратором, и я получаю сообщение об ошибке.

adb shell dpm set-device-owner com.testapp/.DeviceAdminReceiver

Ошибка, которую я возвращаю,

введите здесь описание изображения

Для AndroidManifest.xml добавляю разрешение для Bluetooth

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Для AndroidManifest.xml я регистрирую DeviceAdminReceiver

    <receiver
        android:name="<my package>.DeviceAdminReceiver"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin" />

        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

Мой device_admin.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <wipe-data/>
        <force-lock/>
        <disable-camera/>
        <disable-keyguard-features/>
    </uses-policies>
</device-admin>

Нужно ли для настройки режима киоска назначать администратором свое устройство? И если да, то почему я получаю эту ошибку?


person portfoliobuilder    schedule 14.07.2017    source источник


Ответы (2)


Есть разница между владельцем устройства и администратором устройства. Вы устанавливаете один (администратор устройства) и проверяете другой (владелец устройства).

Владелец устройства обычно задается во время подготовки устройства в начале работы мастера Google. Но его также можно установить после прохождения мастера Google с помощью упомянутой вами команды dpm. Команда dpm может установить владельца устройства, только если на устройстве нет учетных записей. Владелец устройства ограничен, когда его можно установить, из-за имеющегося у него контроля. Корпоративное устройство обычно предоставляется с MDM/EMM в качестве владельца устройства.

Администратор устройства гораздо более ограничен в своем контроле над устройством. Но его можно добавить в любой момент. Каждый выпуск Android все больше и больше ограничивает возможности администратора устройства с тех пор, как Android Enterprise (Android для работы [AfW]) был выпущен в Lollipop.

Наиболее полное решение для киоска настроит устройство с приложением в качестве владельца устройства. Другие решения, которые я видел, используют пользовательский модуль запуска для блокировки устройства путем внесения приложений в белый список, но в этой реализации есть много дыр в безопасности.

Загляните в приложение TestDPC. Google предоставляет ему исходный код, и в нем будет почти все, если не все, что вам нужно. Поэкспериментируйте с контролем, который он дает вам как владельцу устройства.

https://developers.google.com/android/work/build-dpc

https://github.com/googlesamples/android-testdpc

Я предполагаю, что ваше приложение неправильно настроено как владелец устройства или администратор устройства. В частности, убедитесь, что у вас есть DeviceAdminReceiver, объявленный с android:permission="android.permission.BIND_DEVICE_ADMIN" в манифесте вместе с файлом ресурсов xml, содержащим политики, которые он может использовать. Больше вашего исходного кода поможет отладить проблемы, которые вы видите.

person Steve Miskovetz    schedule 17.07.2017
comment
Спасибо за Ваш ответ. Это более понятно. Я также добавил обновления, которые вы упомянули, к моему вопросу. - person portfoliobuilder; 18.07.2017

вы просто используете: startActivity(new Intent().setComponent(new ComponentName("com.android.settings", "com.android.settings.DeviceAdminSettings")));

person Alireza Taghizadeh    schedule 09.02.2021