Программное программирование сторонних приложений

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

startLockTask(); 

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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
}