平板遥控器-屏蔽适配屏幕上下滑动-解决抖音上下滑动按键

提示:平板遥控器-适配上下滑动-解决抖音上下滑动按键

文章目录


前言-需求

实际项目问题:

在使用一款蓝牙遥控器产品时候,发现客户语音按键点击时候 如果当前正好节目电视App 播放节目 或者 抖音App播放视频时候会自动切换节目或者写一个视频的现象。

平板方案产品都会有遥控器功能,比如典型的就是电视产品。 如下讨论的是闺蜜机产品中场景:

  • 很多客户视频软件中有抖音,要求遥控器上下物理按键能够实现切换抖音页面,模拟手势滑动页面效果
  • 实际产品中,大家都是供应链下使用了固定的遥控器,也就是遥控器是固定厂家的,遥控器键值都是固定的。但是遥控器按键键值并不是标准的。
  • 基于上面的一些实际场景,这里就是来解决这个实际问题的,进行一个简单的总结、分享。

需求:适配蓝牙遥控器按键,找到核心原因并解决。

一、参考资料

MTK-Android12-适配蓝牙遥控器按键

其实之前有过相关的案例经验分享:如果你想解决蓝牙遥控器非红外的一些键值对问题,首先你要搞清楚整个系统体系下的键值架构,从底层到中间层再到应用层是如何传递的

搞清楚了整个键值传递架构,那么思路就特别清楚了:最简单的需求时候直接去Framework层,都不用去底层去看看到底是什么问题。如果涉及到复杂的映射、自定义的键值需求那么才会去底层重新进行Linunx Android Framework 层的适配、新增。

二、相关文件-修改

java 复制代码
/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

三、实现方案

就需求而言:给出如下代码

实测发现: 点击语音按键,会触发KeyEvent.KEYCODE_F5,但是我们再这个按键里面做了什么逻辑,做了 模拟界面向上滑动的操作,屏蔽即可。

java 复制代码
    
    private DisplayMetrics dm;
    private int screenWidth = 0;
    private int screenHeight = 0;
    
    public void CustomFling() {
        if(dm == null){
            dm = mContext.getResources().getDisplayMetrics();
        }
        Log.d("huanghb","CustomFling ");
        screenWidth = (dm.widthPixels)/2;
        screenHeight = (dm.heightPixels)/2;
        Log.d("huanghb","CustomFling screenWidth = "+screenWidth);
    }
    
    private void onFiseFling(final int x, final int y,final String slide){
        new Thread(new Runnable() {
            @Override
            public void run() {
                Instrumentation inst = new Instrumentation();
                long dowTime = SystemClock.uptimeMillis();
                int distance=0;
                int distance1=0;
                int distance2=0;
                if(slide.equals("up")){
                    distance=y-300;
                    distance1=y-150;
                    distance2=y-100;
                }else if(slide.equals("down")){
                    distance=y+300;
                    distance1=y+150;
                    distance2=y+100;
                }
                Log.d("huanghb","inst.sendPointerSync Slide "+slide);
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime,MotionEvent.ACTION_DOWN, x, y,0));
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime,MotionEvent.ACTION_MOVE, x, y,0));
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+20,MotionEvent.ACTION_MOVE, x, distance2,0));
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+30,MotionEvent.ACTION_MOVE, x, distance1,0));
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+60,MotionEvent.ACTION_MOVE, x, distance,0));
                inst.sendPointerSync(MotionEvent.obtain(dowTime,dowTime+60,MotionEvent.ACTION_UP, x, distance,0));
                inst.setInTouchMode(false);
            }
        }).start();
    }

四、 思考

通过此需求,映射的是一个基本功能,就是系统适配遥控器如何实现视频软件上下切换页面,这个才是核心本质:那么实际如何调用,如下

java 复制代码
模拟向上滑动:
CustomFling();
onFiseFling(screenWidth, screenHeight+200, "up");

模拟向下滑动:
CustomFling();
onFiseFling(screenWidth, screenHeight-200, "down");

总结

  • 这里通过以往的知识点,进行问题分析,解决实际场景中按键误触的问题。实际误触原因又是什么呢? 语音是遥控器和App 之间通讯的。 却上报了额外的按键键值,恰好触发了之前的业务逻辑导致。
  • 核心的知识点是:遥控器适配模拟屏幕上下滑动的功能。