2015-10-02 42 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 
     } 
    }