屏幕固定不可靠:有时会在唤醒时要求输入密码,有时会直接跳到固定的应用程序
Screen Pinning unreliable: sometimes asks for passcode on awakening, other times skips directly to pinned app
(此问题最初发布在 android 爱好者 存根上,形式略有改动)
我一直在尝试将 android 平板电脑锁定为我正在制作的调查应用程序的信息亭模式;为此,我使用了 Screen Pinning 棒棒糖功能(启用密码)。
我使用了以下代码
@Override
protected void onResume() {
super.onResume();
startLockTask();
}
在大多数情况下,这行得通 "reliably",
- 如果应用程序被固定并且用户让设备屏幕超时(或按下 power/lock 按钮),设备将进入睡眠状态,下次他尝试唤醒设备(通过 power/lock 按钮) 固定的应用程序将再次弹出到视图中(用户不必输入他显然不知道的密码)。
- 另一方面,如果用户尝试取消固定,he/she 会显示锁定屏幕 和 密码。
到目前为止一切顺利。
但是有时(这让我很困惑)当用户试图唤醒设备时,设备不会直接转到固定的应用程序,而是显示锁定屏幕并要求用户输入密码!
我不确定为什么行为不一致(即 唤醒时,它有时会要求输入密码,而其他时候则直接进入固定的应用程序)并且不能在任何地方找到任何提及这种行为的地方。
任何输入将不胜感激!
谢谢!
显然每次设备唤醒时,都会执行 startLockTask()
。如果它已经处于固定模式,这将再次 运行,并导致问题。
最终,我测试了我的初始假设并编辑 onResume()
函数以执行 startLockTask()
only 如果它尚未固定。
这似乎已经解决了问题(尽管我不明白为什么会这样)。如果有人能解释这一点,我会很高兴。
我在这里为遇到此问题的任何人发布答案。
onResume()
@Override
protected void onResume() {
super.onResume();
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP) {
if (!isAppInLockTaskMode()) {
startLockTask();
}
}
}
isAppInLockTaskMode() 取自 并解决了不同 API 版本的问题。
public boolean isAppInLockTaskMode() {
ActivityManager activityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) { // When SDK version is 23
int lockTaskMode=activityManager.getLockTaskModeState();
return lockTaskMode != ActivityManager.LOCK_TASK_MODE_NONE ? true : false;
}
else if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP &&
Build.VERSION.SDK_INT< Build.VERSION_CODES.M) {
//When SDK version <=21 and <23. This API is deprecated in 23.
return activityManager.isInLockTaskMode();
}
else {
return false;
}
}
(此问题最初发布在 android 爱好者 存根上,形式略有改动)
我一直在尝试将 android 平板电脑锁定为我正在制作的调查应用程序的信息亭模式;为此,我使用了 Screen Pinning 棒棒糖功能(启用密码)。 我使用了以下代码
@Override
protected void onResume() {
super.onResume();
startLockTask();
}
在大多数情况下,这行得通 "reliably", - 如果应用程序被固定并且用户让设备屏幕超时(或按下 power/lock 按钮),设备将进入睡眠状态,下次他尝试唤醒设备(通过 power/lock 按钮) 固定的应用程序将再次弹出到视图中(用户不必输入他显然不知道的密码)。 - 另一方面,如果用户尝试取消固定,he/she 会显示锁定屏幕 和 密码。 到目前为止一切顺利。
但是有时(这让我很困惑)当用户试图唤醒设备时,设备不会直接转到固定的应用程序,而是显示锁定屏幕并要求用户输入密码!
我不确定为什么行为不一致(即 唤醒时,它有时会要求输入密码,而其他时候则直接进入固定的应用程序)并且不能在任何地方找到任何提及这种行为的地方。 任何输入将不胜感激!
谢谢!
显然每次设备唤醒时,都会执行 startLockTask()
。如果它已经处于固定模式,这将再次 运行,并导致问题。
最终,我测试了我的初始假设并编辑 onResume()
函数以执行 startLockTask()
only 如果它尚未固定。
这似乎已经解决了问题(尽管我不明白为什么会这样)。如果有人能解释这一点,我会很高兴。
我在这里为遇到此问题的任何人发布答案。
onResume()
@Override
protected void onResume() {
super.onResume();
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP) {
if (!isAppInLockTaskMode()) {
startLockTask();
}
}
}
isAppInLockTaskMode() 取自
public boolean isAppInLockTaskMode() {
ActivityManager activityManager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) { // When SDK version is 23
int lockTaskMode=activityManager.getLockTaskModeState();
return lockTaskMode != ActivityManager.LOCK_TASK_MODE_NONE ? true : false;
}
else if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.LOLLIPOP &&
Build.VERSION.SDK_INT< Build.VERSION_CODES.M) {
//When SDK version <=21 and <23. This API is deprecated in 23.
return activityManager.isInLockTaskMode();
}
else {
return false;
}
}