Экранное закрепление сторонних приложений программно

После получения права собственности на устройство я пытаюсь реализовать метод, позволяющий устройству заблокировать любое приложение в режиме киоска (или в режиме закрепления экрана). Поскольку у меня есть право собственности на устройство, у пользователя не запрашивается разрешение на это.

С веб-сайта разработчика, краткое описание говорит мне, что можно сделать то, что я пытаюсь:

http://developer.android.com/about/versions/android-5.0.html

Программно: чтобы программно активировать закрепление экрана, вызовите startLockTask() из вашего приложения. Если запрашивающее приложение не является владельцем устройства, у пользователя запрашивается подтверждение. Приложение владельца устройства может вызвать метод setLockTaskPackages(), чтобы приложения могли быть прикреплены без шага подтверждения пользователя.

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

Я смог перевести свое приложение в режим закрепления.

Любая помощь будет оценена.

3 ответа

Решение

setLockTaskPackages() используется, чтобы указать, какие приложения (через их имена пакетов) смогут программно закрепляться без подтверждения пользователя. setLockTaskPackages() вызывается из вашего приложения владельца устройства (скорее всего, в вашем DeviceAdminReceiver"s onEnabled() метод).

Итак, в приложении для вашего владельца устройства у вас будет что-то вроде:

mDPM.setLockTaskPackages("com.foo.myapp");

и тогда в вашем приложении "com.foo.myapp" вы будете авторизованы для вызова:

startLockTask(); 

Ваша заявка сразу перейдет в режим закрепления, без подтверждения пользователя.

Если вы не первый register ваше заявление с setLockTaskPackagesприложение будет закреплено, но пользователь должен будет подтвердить сначала.

Также обратите внимание, что когда приложение registered с setLockTaskPackages(), он имеет несколько другое поведение, чем ручной вывод:

  • пользователь не может открепить приложение вручную, нажав " Назад" + " Последние приложения". Вам придется программно открепить ваше приложение с stopLockTask();
  • Кнопки "Домой" и "Последние приложения" невидимы (не отображаются)
  • Когда приложение откреплено (с помощью stopLockTask()), пользователь сразу вернется в "Домой": блокировка экрана не отображается, даже если установлена ​​защита клавиатуры (шаблон, код или любой другой экран клавиатуры).

У меня недостаточно репутации для комментария, просто хочу указать, что для устройств с физическими кнопками (например, Samsung Galaxy Tab A, упомянутых @chairman) одним из способов управления принудительным откреплением приложения является реализация в классе DeviceAdminReceiver класса следующий:

@Override public void onLockTaskModeExiting (Контекст контекста, Намерение намерения)

Так что, если ваш пользователь хочет открепить, вы всегда можете повторно закрепить приложение;)

Вот фрагмент кода, который должен помочь вам:

DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);

if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {
    // Device owner
    String[] packages = {this.getPackageName()};
    myDevicePolicyManager.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
    // Not a device owner - prompt user or show error
}

if (myDevicePolicyManager.isLockTaskPermitted(this.getPackageName())) {
    // Lock allowed
    startLockTask();
} else {
    // Lock not allowed - show error or something useful here
}