小工具知识网

当前位置: 首页 > 行业知识 > 高通 Android 12/13冻结屏幕

行业知识

高通 Android 12/13冻结屏幕

2026-11-08 10:44:52 来源:互联网转载

冻结屏幕很多第一次听到以为是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 Success2024-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"

上一篇:怎么调自走棋的服务器?

下一篇:宽带需要服务器吗怎么设置?