MTK Android10修改屏幕灭屏后点击亮屏

本文介绍了在Android10系统中,通过修改屏幕亮度和驱动程序来实现屏幕灭屏后点击亮屏的两种方法,一种是通过PowerManager控制亮度,另一种是修改驱动以接受触摸事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Android10修改屏幕灭屏后点击亮屏,两种方式
一。修改灭屏方式,去掉power键的逻辑,改为亮度改成0,再按时恢复亮度,这样的话,机器并没有走power的流程,点击事件就能获取到
二。修改驱动,是灭屏之后也能收到TP的触摸事件,通过InputManagerService获取触摸事件


一、修改灭屏方式为修改屏幕亮度为0

1.在PowerManager中增加设置亮度的方法

 public void setLightOff() throws RemoteException {
		Slog.i(TAG, "setLightOff ");
		LightsManager lights = LocalServices.getService(LightsManager.class);
		Light mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);
		mBacklight.setBrightness(0);
		isScreenZero=true;
    }
	
	
    public void setLightOn() throws RemoteException {
		Slog.i(TAG, "setLightOn ");
		LightsManager lights = LocalServices.getService(LightsManager.class);
		Light mBacklight = lights.getLight(LightsManager.LIGHT_ID_BACKLIGHT);
		PowerManager mPowerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
		int brightness = Settings.System.getIntForUser(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,
			mPowerManager.getDefaultScreenBrightnessSetting(),UserHandle.USER_CURRENT_OR_SELF);
		if(brightness<10)
			brightness=10;
		mBacklight.setBrightness(brightness);
		isScreenZero=false;
    }

2.修改power键点击事件

switch (mShortPressOnPowerBehavior) {
case SHORT_PRESS_POWER_NOTHING:
break;
看这里mShortPressOnPowerBehavior的赋值,修改config.xml中config_shortPressOnPowerBehavior为0,及power点击后没有事件,然后再 case SHORT_PRESS_POWER_NOTHING:中添加代码

switch (mShortPressOnPowerBehavior) {
                case SHORT_PRESS_POWER_NOTHING:
                    if(mPowerManager.isScreenZero){
	                    mPowerManager.setLightOn();
					}else{
					 	mPowerManager.setLightOff();
					}
                    break;

3.修改屏幕点击事件,点击亮屏

SystemGesturesPointerEventListener.java中修改,这里有所有的屏幕滑动事件;
这里mPowerManager没有定义,需要定义

public void systemReady() {
        mHandler.post(() -> mGestureDetector =
                new GestureDetector(mContext, new FlingGestureDetector(), mHandler) {});
				mPowerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
    }

--------------------------------------
@Override
    public void onPointerEvent(MotionEvent event) {
		++++ if(mPowerManager.isScreenZero){
	                    mPowerManager.setLightOn();
	           }
        if (mGestureDetector != null && event.isTouchEvent()) {
            mGestureDetector.onTouchEvent(event);
        }

到这里,第一种方式就完成了,有点小bug,就是黑屏的时候,点击事件也会生效,如果点击屏幕,亮起来的时候,就可能会进入其他界面;
修改亮度的代码可以参考
android10 systemUI亮度调节分析

二、方式二 修改驱动,灭屏也能接受触摸事件

1.修改驱动

找到驱动位置,一般在,不同平台需要自己找
kernel-4.14/arch/arm64/boot/dts/mediatek/mt6357.dtsi
kernel-4.14/drivers/input/touchscreen/mediatek/xxxx
修改的话,找两个方法suspend和resume,一般会有如下定义,看看自己对应的是什么方法,

static struct tpd_driver_t tpd_device_driver = {
		.tpd_device_name = "gt9xx",
		.tpd_local_init = tpd_local_init,
		.suspend = tpd_suspend,
		.resume = tpd_resume,
};

在tpd_suspend,tpd_resume后添加tp打开的方法,驱动文件里面找找,基本上有的,这里就添加tpd_on在两个后面即可,然后看驱动说明文件, 在dtsi中可能也要配置,保证TP不断电;

2.修改InputManagerService

这里先说说大概思路,当然要对代码有一定的熟悉程度,touch事件和按键事件都是经过inputManagerservice来分发的,所以InputManagerService的jni文件中就肯定有接收的方法,当然实际是在InputReader和InputDispatch文件中,
先找到com_android_server_input_InputManagerService.cpp , 看看其中对上层的封装方法,找到几个方法
jmethodID interceptKeyBeforeQueueing;
jmethodID interceptMotionBeforeQueueingNonInteractive;
jmethodID interceptKeyBeforeDispatching;
看名字interceptMotionBeforeQueueingNonInteractive,翻译大概意思是,不交互的时候拦截触摸,先加个打印试试,OK,成功,这里能接收到灭屏之后的触摸事件,那就比较简单了

     final boolean mUseDevInputEventForAudioJack;
+       
+       PowerManager mPowerManager;
 
     public InputManagerService(Context context) {
         this.mContext = context;
@@ -394,6 +398,7 @@ public class InputManagerService extends IInputManager.Stub
         if (mWiredAccessoryCallbacks != null) {
             mWiredAccessoryCallbacks.systemReady();
         }
+               mPowerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
     }
 
     private void reloadKeyboardLayouts() {
@@ -1824,12 +1829,17 @@ public class InputManagerService extends IInputManager.Stub
 
     // Native callback.
     private int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
+               Log.e(TAG, "InputManagerService interceptKeyBeforeQueueing");
         return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
     }
 
     // Native callback.
     private int interceptMotionBeforeQueueingNonInteractive(int displayId,
             long whenNanos, int policyFlags) {
+               Log.e(TAG, "interceptMotionBeforeQueueingNonInteractive mPowerManager.isInteractive="+mPowerManager.isInteractive());
+               if(!mPowerManager.isInteractive()){
+                       mPowerManager.wakeUp(SystemClock.uptimeMillis(),1,"touch wakeup");
+               }
         return mWindowManagerCallbacks.interceptMotionBeforeQueueingNonInteractive(
                 displayId, whenNanos, policyFlags);
     }

收到触摸事件, 判断灭屏状态,然后执行wakeup,点击亮屏;
bug:部分驱动唤醒的时候会有点延迟,导致灭屏和亮屏之后一两秒之内,点击无效,这里需要驱动修改,保证tp一直有效,


总结

两种方式,第一种亮屏很快,但是点击事件会传递,当然,如果其他app调用灭屏的话,可能在按power键就亮屏不了;
第二种,亮屏慢一点,跟正常按power键是一样的,对其他app没有影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuyewen288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值