StartLockTask не работает с аппаратными кнопками - PullRequest
3 голосов
/ 29 марта 2019

Я прошел требования обеспечения и владения для использования SetLockTaskPackages() и StartLockTask(). В эмуляторах StartLockTask() работает как положено. Экранные кнопки удаляются, и на экране отображается сообщение «Открепление запрещено вашей организацией». отображается на экране.

Этот метод хорошо работает на поддерживаемых устройствах для блокировки пользователя в среде, похожей на киоск. Хотя некоторые устройства, такие как Samsung Galaxy TabA 7 , имеют аппаратные кнопки. Даже если пользователю сообщают «Открепление не разрешено вашей организацией». они все равно могут использовать комбинацию аппаратных кнопок для выхода из приложения.

Мое решение для этого состояло в том, чтобы обнаружить OnLockTaskModeExiting, а затем уведомить мой MainActivity о повторном применении моих политик и StartLockTask()

Итак, я сделал EventPasser класс. Его задача - поднять событие с DeviceAdminReceiver до моего MainActivity.

    public class EventPasser
    {
        public static event EventHandler ScreenUnlocked;

        public static void RaiseUnlockEvent()
        {
            EventHandler handler = ScreenUnlocked;
            if (null != handler) handler(null, EventArgs.Empty);
        }
    }

В моем DeviceAdminReceiver я слушаю OnLockTaskModeExiting и поднимаю событие, которое прикреплено в моем MainActivity.

    public class DeviceAdmin : DeviceAdminReceiver
    {
        public override void OnLockTaskModeExiting(Context context, Intent intent)
        {

            base.OnLockTaskModeExiting(context, intent);

            // Raise our Unlock Event
            EventPasser.RaiseUnlockEvent();

        }
     }

В моем MainActivity на OnCreate я подключаюсь к статическому событию.

    EventPasser.ScreenUnlocked += EventPasser_ScreenUnlocked;

Событие просто повторно применяет мои политики блокировки и StartLockTask().

    private void EventPasser_ScreenUnlocked(object sender, EventArgs e)
    {
        RegisterAndLock();
    }

Это работает очень хорошо, если не считать небольшого раздражения, которое появляется в сообщении «Приложение заблокировано на экране».

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

Есть ли более прямой способ повторно применить мои StartLockTask() пакеты на OnLockTaskModeExiting? Или даже лучше; Есть ли способ заставить StartLockTask() соблюдать аппаратные кнопки?

...