Android13过GMS的项目,内置了Google计算器,默认使用taskbar模式。
首先Google计算器是支持锁屏下使用的,如果没有设置锁屏密码,使用计算器时手动休眠唤醒,会先看到计算器界面,返回后看到滑动解锁界面或直接进入系统。
但测试中发现,有一种情况,当系统设定了锁屏密码(pin,密码,图案)的同时,设置了永不休眠,打开计算器后,随便按什么按键(包括返回键,home键等),都会直接锁定屏幕。这时导航栏只剩返回键,点击返回后,看到锁屏界面,输入密码后进入系统。
这可能是GoogleCalculator的一个功能或者bug,但提issue给google后,对方回复在Pixel上未复现,并关闭了问题。
至此,只能从系统层面对该问题进行规避。改法很简单,就是如果设置了屏幕锁和永不休眠,并判断当前正在使用google计算器,则不允许亮屏时锁定屏幕。
如果有人知道这是个feature以及这样设定的原因的话,请评论给我讲讲。
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public void setAllowLockscreenWhenOn(int displayId, boolean allow) {
+ if(isCalculator()) {
+ allow = false;
+ }
if (allow) {
mAllowLockscreenWhenOnDisplays.add(displayId);
} else {
@@ -5241,6 +5244,23 @@ public class PhoneWindowManager implements WindowManagerPolicy {
updateLockScreenTimeout();
}
+ private boolean isCalculator() {
+ try {
+ boolean neversleep = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_OFF_TIMEOUT, 0) == 0;
+ if(neversleep && mKeyguardDelegate.isSecure(mCurrentUserId)) {
+ ComponentName cn = ActivityManagerNative.getDefault().getTasks(1).get(0).topActivity;
+ if (cn.getClassName().equals("com.android.calculator2.Calculator")){
+ Log.d("Luanne", "Top is Calculator and is secure lock screen and never sleep.");
+ return true;
+ }
+ }
+ } catch (RemoteException e) {
+ return false;
+ }
+ return false;
+ }
+
private void updateLockScreenTimeout() {
synchronized (mScreenLockTimeout) {