给TV添加一个投屏热键:基于MTK9269 android 9.0
Posted 阿迷创客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给TV添加一个投屏热键:基于MTK9269 android 9.0相关的知识,希望对你有一定的参考价值。
文章目录
给TV添加一个投屏热键:基于MTK9269 android 9.0
一、前言
最近给TV投影仪添加了一个热键,不像之前通过HotkeyDispatcher来处理,而是直接通过PhoneWindowManager.java来发送intent,简单粗暴,本文记录一下,同时简要描述下按键的处理流程。
二、安卓按键的映射流程
2.1 映射流程
2.2 参考:红外遥控扫描码
- 例如将下图的0x3D按键,做成键盘的F10按键
三、投屏热键的实现
3.1 需求描述
遥控器有一键投屏按键,具体功能如下:
- 电视系统响应这个0x3D的红外键值和HID 0x43,也就是键盘的F10,做成系统键,在任何界面都要响应这个按键
- 接收到这个按键后,通过action启动服务
- 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 键值映射关系
- IR硬件扫描码在驱动里面被映射为 include/uapi/linux/input.h 里面定义的某个键值,但这个键值只在linux系统(内核)中使用
- Android通过源码目录下的 device/xxx/xxx.kl(keylayout) 文件完成linux键值到Android系统要使用的键值映射。
以上是关于给TV添加一个投屏热键:基于MTK9269 android 9.0的主要内容,如果未能解决你的问题,请参考以下文章
团队环境搭建:MTK平台,Android 9.0内销TV编译服务器配置
团队环境搭建:MTK平台,PTK5.1Supernova编译环境配置