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

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


前言

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没有影响

实现 Android 双击亮屏的方式可以通过重写 Activity 的 onTouchEvent 方法,监听用户的手势操作。具体实现步骤如下: 1. 定义一个变量记录用户点击屏幕的时间,初始值为0。 2. 重写 Activity 的 onTouchEvent 方法,监听用户手势操作。 3. 在 onTouchEvent 方法中,根据用户手势操作的类型,判断是否为双击事件。 4. 如果是双击事件,则获取系统的 PowerManager 对象,并调用其 wakeUp 方法,唤醒屏幕。 以下是一个简单的示例代码: ```java public class MainActivity extends AppCompatActivity { private long lastClickTime = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { long currentTime = System.currentTimeMillis(); if (currentTime - lastClickTime < 500) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = pm.newWakeLock( PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "DoubleTapWakeLock"); wakeLock.acquire(1000); } lastClickTime = currentTime; } return super.onTouchEvent(event); } } ``` 在这个示例代码中,我们在 onTouchEvent 方法中判断两次点击时间间隔是否小于 500 毫秒,如果是,则认为是双击事件,调用 PowerManager 的 wakeUp 方法唤醒屏幕。注意,这里需要申请 WakeLock 权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xuyewen288

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

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

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

打赏作者

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

抵扣说明:

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

余额充值