提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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没有影响