高通 Android 12/13冻结屏幕

冻结屏幕很多第一次听到以为是Android一种异常现象,实则不然,就是防止用户在做一些非法操作导致问题防止安全漏洞问题。

1、主要通过用户行为比如禁止下拉状态栏和按键以及onTouch 事件拦截等,不知道请看这篇文章(Touch事件传递流程、事件分发中的onTouch 和onTouchEvent 有什么区别,又该如何使用?_事件分发中的ontouch和ontouchevent有什么区别,又该如何使用?-CSDN博客

主要修改代码

PhoneWindowManager # interceptKeyBeforeDispatching # interceptKeyBeforeQueueing # interceptMotionBeforeQueueingNonInteractive#

ViewGroup #onInterceptTouchEvent

StatusBar # onTouchEvent

PhoneStatusBarView# onTouchEvent

2308  freeze Screen           system_process                       E  set freezeScreen Status Success
2024-05-23 11:49:52.744  1331-4710  unfreeze Screen         system_process                       E  set isUnfreezeScreen Status Success=
2024-05-23 11:52:36.634  1331-2308  freeze Screen           system_process                       E  set freezeScreen Status Success

2、实现逻辑比较简单 代码如下图所示 通过系统属性persist.xxx.screen_frozen去控制

ViewGroup.java

代码路径frameworks/base/core/java/android/view/ViewGroup.java 在onInterceptTouchEvent进行拦截

 public boolean onInterceptTouchEvent(MotionEvent ev) {
		boolean isFreezeScreen = SystemProperties.getBoolean("persist.xxx.screen_frozen", false);
		Log.e("ZM","onInterceptTouchEvent="+isFreezeScreen);
		if(isFreezeScreen == true){
			Log.e("ZM","onInterceptTouchEvent isFreezeScreen="+isFreezeScreen);
			return true;
		}
		if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
                && ev.getAction() == MotionEvent.ACTION_DOWN
                && ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
                && isOnScrollbarThumb(ev.getX(), ev.getY())) {
            return true;
        }
        return false;
    }

3、/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java

onTouchEvent设置为true表示拦截此事件 不再往下传递。

 @Override
    public boolean onTouchEvent(MotionEvent event) {
		boolean isFreezeScreen = SystemProperties.getBoolean("persist.xxx.screen_frozen", false);
		Log.e("ZM","PhoneStatusBarView="+isFreezeScreen);
		if(isFreezeScreen == true){
			Log.e("ZM","onTouchEvent PhoneStatusBarView isFreezeScreen="+isFreezeScreen);
			return true;
		}
        if (mTouchEventHandler == null) {
            Log.w(
                    TAG,
                    String.format(
                            "onTouch: No touch handler provided; eating gesture at (%d,%d)",
                            (int) event.getX(),
                            (int) event.getY()
                    )
            );
            return true;
        }
        return mTouchEventHandler.handleTouchEvent(event);
    }

4、PhoneWindowManager里面拦截 按键KeyUp/KeyDown事件代码

+         // 添加一个标志来控制是否启用锁定
+   // private boolean isScreenLocked = true;
+       //zm fix
+       private static final String SYS_PROP_SCREEN_FROZEN = "persist.xxx.screen_frozen";
+       
+       private boolean mScreenFrozen = false;
 
     /**
      * Keyguard stuff
@@ -2664,8 +2670,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     @Override
     public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,
             int policyFlags) {
+               mScreenFrozen = SystemProperties.getBoolean(SYS_PROP_SCREEN_FROZEN, false);
         final boolean keyguardOn = keyguardOn();
         final int keyCode = event.getKeyCode();
+               Log.e("ZM", "interceptKeyBeforeDispatching Block Home key2 mScreenFrozen="+mScreenFrozen);
+               if (mScreenFrozen) {
+                // 禁止所有按键输入
+                           Log.e("ZM", "free Screen interceptKeyBeforeDispatching Block Home key"+event.toString());
+               if (keyCode == KeyEvent.KEYCODE_BACK ||
+            keyCode == KeyEvent.KEYCODE_APP_SWITCH || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME
+                keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_HOME) {
+                               Log.e("ZM", "free Screen interceptKeyBeforeDispatching Block Home key2===="+event.toString());
+                return -1; // Prevent the key event from being dispatched
+            }
+        }
         final int repeatCount = event.getRepeatCount();
         final int metaState = event.getMetaState();
         final int flags = event.getFlags();
@@ -3504,6 +3522,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     /** {@inheritDoc} */
     @Override
     public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
+               mScreenFrozen = SystemProperties.getBoolean(SYS_PROP_SCREEN_FROZEN, false);
+               Log.e("ZM", "free Screen interceptKeyBeforeQueueing KeyEvent="+mScreenFrozen);
+               if (mScreenFrozen) {
+            // 禁止所有按键输入
+                       int keyCode = event.getKeyCode();
+                       if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
+                keyCode == KeyEvent.KEYCODE_POWER || keyCode == KeyEvent.KEYCODE_HOME) {
+                               Log.e("ZM", "free Screen interceptKeyBeforeQueueing KeyEvent="+event.toString());
+                return 0;
+            }
+                       Log.e("ZM", "free Screen interceptKeyBeforeQueueing KeyEvent2="+event.toString());
+        }
         final int keyCode = event.getKeyCode();
         final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
         boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
@@ -4092,6 +4122,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
     @Override
     public int interceptMotionBeforeQueueingNonInteractive(int displayId, long whenNanos,
             int policyFlags) {
+                     if (mScreenFrozen) {
+                                 //zm fix
+                             Log.e("ZM","interceptMotionBeforeQueueingNonInteractive=====");
+                  return 0;
+              }

5、apk调用代码也比较简单示例如下

/**
     * 冻结屏幕
     */
    public void freezeScreen() {
		SystemProperties.set("persist.xxx.screen_frozen", "true");
		Log.e("freeze Screen", "set freezeScreen Status Success");
    }

    /**
     * 屏幕是否冻结
     *
     * @return
     */
    public boolean isFreezeScreen() {
		// 获取系统属性 persist.xxx.screen_frozen 的值
        String value = SystemProperties.get("persist.sys.screen_frozen", "false");
		Log.e("isFreezeScreen","value="+value);
        // 将属性值转换为布尔值
        return Boolean.parseBoolean(value);
    }

    /**
     * 解冻屏幕
     */
    public void unfreezeScreen() {
        SystemProperties.set("persist.xxx.screen_frozen", "false");
		Log.e("unfreeze Screen", "set isUnfreezeScreen Status Success=");
	}

最后别忘记记得把屏幕保持常亮哈,转载请注明出现高通 Android 12/13冻结屏幕-CSDN博客,谢谢!

最后补充:

// 设置屏幕常亮

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

记得加系统签名哈

 android:sharedUserId="android.uid.system"
相关推荐
ac-er88883 小时前
Yii框架中的队列:如何实现异步操作
android·开发语言·php
流氓也是种气质 _Cookie5 小时前
uniapp 在线更新应用
android·uniapp
zhangphil7 小时前
Android ValueAnimator ImageView animate() rotation,Kotlin
android·kotlin
徊忆羽菲7 小时前
CentOS7使用源码安装PHP8教程整理
android
编程、小哥哥9 小时前
python操作mysql
android·python
Couvrir洪荒猛兽9 小时前
Android实训十 数据存储和访问
android
五味香11 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
十二测试录12 小时前
【自动化测试】—— Appium使用保姆教程
android·经验分享·测试工具·程序人生·adb·appium·自动化
Couvrir洪荒猛兽13 小时前
Android实训九 数据存储和访问
android
aloneboyooo14 小时前
Android Studio安装配置
android·ide·android studio