给TV添加一个投屏热键:基于MTK9269 android 9.0

简介: 本文介绍了在基于MTK9269 Android 9.0系统的电视上添加投屏热键的方法,包括配置红外遥控器按键映射、在PhoneWindowManager.java中添加按键响应代码,以及创建一个接收Intent的Android应用程序来处理热键触发的动作。

给TV添加一个投屏热键:基于MTK9269 android 9.0

一、前言

最近给TV投影仪添加了一个热键,不像之前通过HotkeyDispatcher来处理,而是直接通过PhoneWindowManager.java来发送intent,简单粗暴,本文记录一下,同时简要描述下按键的处理流程。

二、安卓按键的映射流程

2.1 映射流程

红外遥控器 Linux内核HID Android 将IR硬解码 转 Linux按键码 Linux 按键码 转 KEYCODE_XX 红外遥控器 Linux内核HID Android

2.2 参考:红外遥控扫描码

  • 例如将下图的0x3D按键,做成键盘的F10按键
    在这里插入图片描述

三、投屏热键的实现

3.1 需求描述

遥控器有一键投屏按键,具体功能如下:

  1. 电视系统响应这个0x3D的红外键值和HID 0x43,也就是键盘的F10,做成系统键,在任何界面都要响应这个按键
  2. 接收到这个按键后,通过action启动服务
  3. Intent 描述:Action:com.amizhou.action.tvkey 参数:key:param value:happyplay

3.2 关键修改

3.2.1 开启IR设备
//android\kernel\fusion\mstar2\drv\ir_mirc\ir_config.h
//Number of IR should this chip supported
#define IR_SUPPORT_NUM 1

//Add & Modify Customer IR with Differ Headcode Here
static IR_Profile_t ir_config[IR_SUPPORT_NUM]=
{
   
   
//   protocol_type, Headcode, IRSpeed ,enable
    {
   
   IR_TYPE_NEC,NUM_KEYMAP_MSTAR_TV,0,1},           // Mstar IR customer code
    // …… 省略  ……
    //{IR_TYPE_TOSHIBA,NUM_KEYMAP_SKYWORTH_TV,0,1},        //skyworth toshiba ir
    // …… 省略  ……
};
3.2.2 扫描码配置
  • keymap-mstar-tv.c 或 ir_config.ini ,请使用自己平台的配置文件

  • 投屏按键用KEY_F10按键: { 0x3d, KEY_F10 },

//android\kernel\fusion\mstar2\drv\ir_mirc\keymaps\keymap-mstar-tv.c
static struct key_map_table mstar_tv[] = {
   
   
    {
   
    0x12, KEY_POWER },
// …… 省略  ……
    {
   
    0x3D, KEY_F10 },      //a Screen projection Hotkey 
};
3.2.3 添加热键或响应
  • PhoneWindowManager.java: android\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
  • 按键 KEYCODE_F10
  • 效果:接受到按键后,直接发送一个intent,启动一个APP
1. Intent 发送端:PhoneWindowManager.java
  • 接收遥控器0x3D按键,或者键盘的F10按键
        else if (keyCode == KeyEvent.KEYCODE_F10) {
   
   
            Log.d(TAG, "zs, amizhou KEYCODE_F10, down="+down);
            if (down)
            {
   
   
                Intent intent = new Intent();
                intent.setAction("com.amizhou.action.tvkey");
                intent.putExtra("param","happyplay");
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                mContext.startActivity(intent);
            }
            return 0;
        }
2. Intent 接送端APP: AndroidManifest.xml
  • 接收端,我这里是创建了一个模拟的 Intent 接送端APP,如下,注册了一个接收指定ACTION的Activity

  • 备注:所有的Intent都必须有一个category,没有时,默认为"android.intent.category.DEFAULT"

        <activity
            android:name=".HotkeyMainActivity"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.amizhou.action.tvkey" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
3. Intent 接送端APP: 获取Intent数据
public class HotkeyMainActivity extends AppCompatActivity {
   
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hotkey_main);
        Intent intent = getIntent();
        String p = intent.getStringExtra("param"); // p = "happyplay"
        TextView tv = findViewById(R.id.tv_show);
        tv.append(p); 
    }
}

四、附录

4.1 博客参考

Android : 输入设备键值从底层到应用层的映射流程 - 走看看 (zoukankan.com)

4.2 安卓输入子系统

Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口。最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件。这个过程由InputManagerService(以下简称IMS)系统服务为核心的多个参与者共同完成。
在这里插入图片描述

4.3 键值映射关系

  1. IR硬件扫描码在驱动里面被映射为 include/uapi/linux/input.h 里面定义的某个键值,但这个键值只在linux系统(内核)中使用
  2. Android通过源码目录下的 device/xxx/xxx.kl(keylayout) 文件完成linux键值到Android系统要使用的键值映射。
    在这里插入图片描述
相关文章
|
7月前
|
编解码 Linux Android开发
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
5254 0
|
Java API Android开发
Android TV 开发之 TV视频播放器(上)
Android TV 开发之 TV视频播放器(上)
1025 0
Android TV 开发之 TV视频播放器(上)
|
Android开发
Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public...
7697 0
|
6月前
|
XML Java 开发工具
Android Studio开发Android TV
【6月更文挑战第19天】
209 5
|
6月前
|
编解码 开发工具 Android开发
技术心得:打造自己的智能投屏体验——Android投屏开发入门
技术心得:打造自己的智能投屏体验——Android投屏开发入门
376 0
|
7月前
|
Android开发 开发者
安卓投屏神器 Scrcpy安 报错ERROR: Could not find any ADB device
安卓投屏神器 Scrcpy安 报错ERROR: Could not find any ADB device
374 9
|
7月前
|
Android开发 开发者
安卓投屏神器 Scrcpy安 报错ERROR: Could not find any ADB device
使用Scrcpy安卓投屏工具时遇到报错,问题根源是未开启开发者模式。解决步骤:进入设置,点击【关于手机】→连续点击版本号激活开发者模式,然后在【系统设置】→【开发者选项】中开启USB调试。参照此方法后可正常执行。Scrcpy软件下载链接和GitHub页面也已提供。
815 1
|
存储 安全 JavaScript
如何在ios成功上架android tv?
如何在ios成功上架android tv?
|
编解码 安全 Android开发
AirServer2023专业的投屏软件,支持安卓、苹果手机投屏至电脑
AirServer一款专业的投屏软件,支持安卓、苹果手机投屏至电脑,畅享办公、教学、直播、会议、游戏、2K高清投屏详细的投屏教程让投屏更加简单,同时支持多设备投屏、不需要中间的转换设备,可以直接进行投屏,并且可以由用户自定义投屏图像的分辨率。AirServer可以保证文件传输的安全以及可靠!AirServer是一个Mac专用投屏工具,功能强大,并且可以通过网络和其他平台同步视频内容。可以使用多个设备进行投屏,快速查看同一局域网内的视频。支持的设备:苹果系统。支持 Windows、 Mac、 Android、 iOS、 windows平台。
301 0
|
存储 安全 JavaScript
如何在ios成功上架android tv?​
如何在ios成功上架android tv?​
135 0
如何在ios成功上架android tv?​