2015-10-02 4 views
2

Я хочу реализовать KioskMode, я нацелен только на Android L, так как это очень специфичное приложение.Android: Stop Back Button From Exiting LockTask/Kiosk Mode

Я уже прошел процесс установки своего приложения как DeviceAdmin, и DevicePolicyManager.isLockTaskPermitted(this.getPackageName()) уже возвращает true.

Затем я начинаю LockTask через startLockTask().

Все в порядке, но когда я удерживаю backbutton, приложение по-прежнему выходит из режима киоска.

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

Я действительно не знаю, что делать в данный момент, и был бы благодарен за каждый вход.

я теперь переопределены

@Override 
public boolean onKeyDown(int KeyCode, KeyEvent event) 
{ 
    if(KeyCode == KeyEvent.KEYCODE_BACK) 
    { 
     BackDownButtonPressed = true; 
     if(VolDownPressed) 
      showTaskLockDialog(); 
     return true; 
    } 
    else if(KeyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
     VolDownPressed = true; 
     if(BackDownButtonPressed) 
      showTaskLockDialog(); 
     return true; 
    } 
    return super.onKeyDown(KeyCode, event); 
} 

@Override 
public boolean onKeyUp(int KeyCode, KeyEvent event) { 
    if(KeyCode == KeyEvent.KEYCODE_BACK) 
    { 
     BackDownButtonPressed = false; 
     return true; 
    } 
    else if(KeyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
     VolDownPressed = false; 
     return true; 
    } 
    return super.onKeyUp(KeyCode, event); 
} 

@Override 
public void onBackPressed() 
{ 
    return; 
} 

@Override 
public boolean onNavigateUp() { 
    return true; 
} 

@Override 
public boolean dispatchKeyEvent (KeyEvent event) 
{ 
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
     return true; 
    } 
    return true; 
} 

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //do something or nothing in your case 
     return true; 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 

Для записи, я использую Samsung SM-T700 Tablet с CyanogenMod CM12.1

+0

У вас есть overriden onBackPressed()? –

+0

Да, я сделал, не меняет проблему печально – timschoen

+0

Вы можете открыть диалог по щелчку мышью? – Radhey

ответ

0

Просто, чтобы закрыть эту тему ..

Я не мог найти идеальное решение по сей день. Мое текущее обходное решение получает событие, если пользователь покидает режим киоска и снова входит в режим киоска.

К сожалению, это оставляет пользователю 2 тоста, в которых говорится, что «экран не закреплен» и «экран закреплен», что является неудачным. Но это удовлетворяет мои текущие потребности.

+0

Как вы можете получить событие, когда пользователь покидает режим киоска? В настоящее время я сталкиваюсь с проблемой, если пользовательское нажатие кнопки кнопки выйдет из режима киоска. Любое обходное решение, чтобы избежать этого. –

0

Возможно, вам необходимо переопределить onKeyLongPress

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     //do something or nothing in your case 
     return true 
    } 
    return super.onKeyLongPress(keyCode, event); 
} 
+0

уже пробовал это. Событие, кажется, распространяется, даже если я вернусь. Теперь я рассмотрел несколько методов, см. Http://stackoverflow.com/posts/32909074/revisions – timschoen

+0

. Можете ли вы добавить фактические переопределения, которые вы написали на свой вопрос? – grrrrrr

+0

Конечно, я сделал это сейчас. – timschoen

0

Не уверен, что это вообще полезно, но я написал блог об установке режима киоска здесь: http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/

А также написал пример кода для него здесь: https://github.com/sureshjoshi/android-kiosk-example

Не уверен, что если вы видите какие-либо существенные различия между вашим кодом и моим, но я просто пытался сделать долгое нажатие на Samsung Galaxy Tab 4 работает Android 5.0 , и он не выйдет из приложения.

Это может быть что-то с укоренением с цианоном?

Если вы не имеете это в вашем коде, возможно, добавить его и проверить, если вы видите какие-либо проблемы:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Remove title bar and notification bar 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class); 
     mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 
     if (!mDpm.isAdminActive(deviceAdmin)) { 
      Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show(); 
     } 

     if (mDpm.isDeviceOwnerApp(getPackageName())) { 
      mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()}); 
     } else { 
      Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show(); 
     } 

     mDecorView = getWindow().getDecorView(); 
} 

и

protected void enableKioskMode(boolean enabled) { 
     try { 
      if (enabled) { 
       if (mDpm.isLockTaskPermitted(this.getPackageName())) { 
        startLockTask(); 
        mIsKioskEnabled = true; 
       } else { 
        Toast.makeText(this, getString(R.string.kiosk_not_permitted), Toast.LENGTH_SHORT).show(); 
       } 
      } else { 
       stopLockTask(); 
       mIsKioskEnabled = false; 
      } 
     } catch (Exception e) { 
      // TODO: Log and handle appropriately 
     } 
    } 
0

У меня такая же проблема: How to stop "holding the back button" from escaping "Lock Task mode" on Android 6+

Проблема возникает только на моем Android 7 таблетки.

Запуск приложения на моем планшете Android 6 исправил проблему.

Не могли бы вы добавить код, чтобы проиллюстрировать вашу текущую работу?