Android 视频终端语音控制、按键模拟
来源:互联网 发布:泰罗奥特曼act淘宝 编辑:程序博客网 时间:2024/04/27 23:01
终端语音控制的实现,主要的工作在于语音识别和语义的识别,而这部分的工作通常借助于现有的语音识别方案提供商,如科大讯飞、车音等。通过与这类语音识别商的合作,对智能终端体系的语音控制就可以指日可待了,只需要实现应用层面的适配对接,实现视频类终端的语音控制体系,通常主要考虑以下几个层面:
1、模拟按键
如确定、返回、主页、菜单以及其他按键控制等。
2、系统设置
如音量控制、画面调节等,音量控制如音量加、音量减、静音、取消静音。
3、应用调度
搜索、电影、电视、应用商店产品呼出等。
4、场景控制
当前场景内的各类可视交互元素跳转(全程语音交互),例如:
(1)对视频搜索结果之后的控制
(2)对视频播放环节的控制,如暂停、停止、返回、重新播放、下一集、快进、快退等。甚至对直播节目进行中文、数字频道切换
(3)其他的特色类服务控制。
相应的顶层、部分一二级用例场景如下图所示:
语音控制的基本过程,可主要参见如下的语音搜索类控制的交互过程:
对于按键的模拟,主要通过以下方法来实现:
注意,按键的模拟需要拥有root权限,所以通常会将以下处理封装为Android系统层服务进行调用(需做系统签名),相关权限配置:
<uses-permission android:name="android.permission.INJECT_EVENTS"/>
// 4.2.2之前适用public class KeySimulate {/* The WindowManager capable of injecting keyStrokes. */final IWindowManager windowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));/** * Wrapper-function taking a KeyCode. A complete KeyStroke is DOWN and UP * Action on a key! */public void simulateKeystroke(int KeyCode) {VoiceMgr.d("simulate keyCode:" + KeyCode);doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyCode));doInjectKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyCode));}/** This function actually handles the KeyStroke-Injection. */public void doInjectKeyEvent(KeyEvent kEvent) {try {/* Inject the KeyEvent to the Window-Manager. */windowManager.injectKeyEvent(kEvent, false);} catch (RemoteException e) {e.printStackTrace();}}}
// 4.2.2之后适用public class KeySimulateExt {public void simulateKeystroke(final int KeyCode) {VoiceMgr.d("simulate keyCode:" + KeyCode);Thread sendKeyEvent = new Thread() {@Overridepublic void run() {try {Thread.sleep(100); // TouchEventlong now = SystemClock.uptimeMillis();KeyEvent down = new KeyEvent(now, now,KeyEvent.ACTION_DOWN, KeyCode, 0);KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP,KeyCode, 0);InputManager.getInstance().injectInputEvent(down,InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);InputManager.getInstance().injectInputEvent(up,InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);} catch (Exception e) {e.printStackTrace();}}};sendKeyEvent.start();}/** This function actually handles the KeyStroke-Injection. */public void doInjectKeyEvent(KeyEvent kEvent) {try {InputManager.getInstance().injectInputEvent(kEvent,InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH);} catch (Exception e) {e.printStackTrace();}}}
对于语音消息的收集处理,可以建立语音消息总线进行分发处理,相关设计类图如下:
相关代码示例:点击下载
<receiver android:name="com.voice.VoiceReceiver" > <intent-filter> <action android:name="com.xxx.xiri.VOD" /> <action android:name="com.xxx.xiri.TV" /> <action android:name="com.xxx.xiri.KEY" /> <action android:name="com.xxx.xiri.VOLUME" /> <action android:name="com.xxx.xiri.PLAYER" /> <action android:name="com.action.RECEIVE_XMPP" /> <action android:name="xxx.action.msgbus" /> </intent-filter> </receiver>
- Android 视频终端语音控制、按键模拟
- android 软按键 模拟按键
- 远程控制篇:模拟按键
- 远程控制篇:模拟按键
- android 模拟按键
- android 应用模拟按键
- android 模拟按键
- Android模拟按键
- Android 模拟物理按键
- Android模拟按键
- 命令模拟android 按键
- android 按键模拟
- Android 模拟物理按键
- Android 模拟按键汇总
- Android 实现模拟按键
- android 模拟按键
- android按键模拟测试
- android 模拟按键
- 最新的英语六级词汇
- Android系统进程Zygote启动过程的源代码分析
- 静态控件(static)
- Excel数据通过plsql 导入到Oracle
- 大型网站架构不得不考虑的10个问题(转)
- Android 视频终端语音控制、按键模拟
- 3维凸包模板
- Javascript图片放大镜
- gcc和g++的区别
- IE6 jQuery 操作 select的BUG
- Linux 的壁纸 在这个目录
- 大型网站架构演变和知识体系
- 凡客的品牌危机
- 详解struct sockaddr