2015-10-02 41 views
2

我想執行KioskMode,我只針對Android L,因爲這是一個非常特定的應用程序。Android:停止退出LockTask/Kiosk模式的按鈕

我已經完成了將我的應用程序設置爲DeviceAdmin的過程,並且 DevicePolicyManager.isLockTaskPermitted(this.getPackageName())已經返回true。我通過startLockTask()開始LockTask

一切都很好,但是當我按住backbutton時,應用仍然退出信息亭模式。

我已覆蓋onKeyPress以顯示用於解鎖應用程序的自定義對話框,但這並不妨礙android自動退出我的鎖定任務,如果用戶按下後退。

我現在不知道該怎麼做,並會感謝每一個輸入。

我現在已經覆蓋

@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); 
} 

爲了記錄在案,我使用的是三星SM-T700平板電腦的CyanogenMod CM12.1

+0

你重寫了onBackPressed()嗎? –

+0

是的,我做了,不難改變這個問題 – timschoen

+0

你是否能夠打開後退按鈕上的對話框? – Radhey

回答

0

只是爲了關閉這個主題..

我找不出一個完美的解決方案,以今天。如果用戶離開信息亭模式並再次進入信息亭模式,我目前的解決方法是收到一個事件。

不幸的是,這使用戶留下2個敬酒,說「屏幕取消固定」和「屏幕固定」,這是不幸的。但這符合我目前的需求。

+0

如何在用戶離開自助服務終端模式時獲得活動?如果用戶長時間按下按鈕應用程序退出Kiosk模式,我目前面臨的問題。任何避免它的解決方法。 –

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

已經嘗試過。即使我返回true,事件似乎也會傳播。 我現在已經覆蓋了一些方法,請參閱http://stackoverflow.com/posts/32909074/revisions – timschoen

+0

你可以添加你寫到你的問題的實際覆蓋? – grrrrrr

+0

當然,我現在這樣做了。 – timschoen

0

不知道它是否有幫助,但我寫了一篇關於設置Kiosk Mode的博客: http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/

而且還寫了示例代碼在這裏: https://github.com/sureshjoshi/android-kiosk-example

,如果你看到你的代碼和我之間的主要區別不知道,但我只是試圖做一個三星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 
     } 
    }