Android:停止退出 LockTask/Kiosk 模式的后退按钮
Android: Stop Back Button From Exiting LockTask / Kiosk Mode
我想实现一个 KioskMode
,我只针对 Android L
,因为这是一个非常具体的应用程序。
我已经完成了将我的应用程序设置为 DeviceAdmin 的过程,并且
DevicePolicyManager.isLockTaskPermitted(this.getPackageName())
已经 returns 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);
}
郑重声明,我使用的是带有 Cyanogenmod CM12.1 的三星 SM-T700 平板电脑
也许您需要覆盖 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);
}
不确定它是否有帮助,但我在这里写了一篇关于设置 Kiosk 模式的博客:
http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/
并且还在此处为其编写了示例代码:
https://github.com/sureshjoshi/android-kiosk-example
不确定您是否发现您的代码与我的代码有任何重大差异,但我只是尝试在 Samsung Galaxy Tab 4 运行 Android 5.0 上长按,它不会'不要退出应用程序。
会不会是用 Cyanogen 刷机?
如果你的代码中没有这个,也许添加它并检查你是否发现任何问题:
@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
}
}
只是为了结束这个话题..
直到今天我都想不出一个完美的解决方案。我当前的解决方法是在用户离开信息亭模式并再次进入信息亭模式时接收事件。
遗憾的是,这给用户留下了 2 个祝酒词 "screen unpinned" 和 "screen pinned",这很不幸。但这满足了我目前的需求。
我有同样的问题:How to stop "holding the back button" from escaping "Lock Task mode" on Android 6+
这个问题只出现在我的 Android 7 平板电脑上。
运行 我的 Android 6 平板电脑上的应用程序解决了这个问题。
您能否添加一些代码来说明您当前的解决方法?
我想实现一个 KioskMode
,我只针对 Android L
,因为这是一个非常具体的应用程序。
我已经完成了将我的应用程序设置为 DeviceAdmin 的过程,并且
DevicePolicyManager.isLockTaskPermitted(this.getPackageName())
已经 returns 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);
}
郑重声明,我使用的是带有 Cyanogenmod CM12.1 的三星 SM-T700 平板电脑
也许您需要覆盖 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);
}
不确定它是否有帮助,但我在这里写了一篇关于设置 Kiosk 模式的博客: http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/
并且还在此处为其编写了示例代码: https://github.com/sureshjoshi/android-kiosk-example
不确定您是否发现您的代码与我的代码有任何重大差异,但我只是尝试在 Samsung Galaxy Tab 4 运行 Android 5.0 上长按,它不会'不要退出应用程序。
会不会是用 Cyanogen 刷机?
如果你的代码中没有这个,也许添加它并检查你是否发现任何问题:
@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
}
}
只是为了结束这个话题..
直到今天我都想不出一个完美的解决方案。我当前的解决方法是在用户离开信息亭模式并再次进入信息亭模式时接收事件。
遗憾的是,这给用户留下了 2 个祝酒词 "screen unpinned" 和 "screen pinned",这很不幸。但这满足了我目前的需求。
我有同样的问题:How to stop "holding the back button" from escaping "Lock Task mode" on Android 6+
这个问题只出现在我的 Android 7 平板电脑上。
运行 我的 Android 6 平板电脑上的应用程序解决了这个问题。
您能否添加一些代码来说明您当前的解决方法?