1

(这个问题最初以稍微改变的形式发布在android 爱好者存根上)

我一直在尝试为我正在制作的调查应用程序将安卓平板电脑锁定在信息亭模式;为此,我使用了Screen Pinning lollipop 功能(启用密码)。我使用了以下代码

@Override
    protected void onResume() {
        super.onResume();
        startLockTask();
}

在大多数情况下,这工作“可靠”, - 如果应用程序被固定并且用户让设备屏幕超时(或按下电源/锁定按钮),设备将进入睡眠状态,下次他尝试唤醒设备(通过电源/锁定按钮)固定的应用程序将再次弹出视图(用户无需输入他显然不知道的密码)。- 另一方面,如果用户试图取消固定,他/她会看到锁定屏幕密码。到现在为止还挺好。

但是有时(这让我很困惑)当用户尝试唤醒设备时,设备不会直接进入固定的应用程序,而是显示锁定屏幕并要求用户输入密码!

我不确定为什么行为不一致(即在唤醒时,它有时会要求输入密码,而其他时候会直接进入固定的应用程序)并且在任何地方都找不到这种行为的任何提及。任何输入将不胜感激!

谢谢!

4

1 回答 1

2

显然,每次设备唤醒时,startLockTask()都会执行。如果它已经处于固定模式,这将再次运行,并导致问题。最终,我测试了我最初的假设并编辑了onResume()函数以startLockTask() 在它尚未固定时才执行。这似乎已经解决了问题(尽管我不明白为什么会出现这种行为)。如果有人能解释这一点会很高兴。我在这里为遇到此问题的任何人发布答案。

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;
        }
    }
于 2016-09-28T21:14:23.007 回答