Android 小米盒子游戏手柄按键捕获

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

终于又告一段落,可以好好休息一下了。

以前,提及身体,总是再坚持一下,就这样坚持了 15 年。

现在,提及生命,不敢再坚持一下,还是休养一段,再整装前行,也来得及。

记得高中老师教导过我们,休息是学习的重要组成部分,

那么,休养是工作、生活的重要组成部分,就合情合理了。

我是一个闲不住的人,时刻都感到危机的存在,不敢稍停脚步,狠怕被后面的穷鬼追上,或是前面的曙光遗忘。

不知从何时开始,另一种危机感由然而生,

总是预见到自已无力去做到眼前的小事,倍感心凉,渐而被生命遗忘。

趁此良机,边休养,边捣腾一下家里的小米套装。

下面就晒晒我这个非米粉所拥有的米装备,可以解读为显摆,不过更多要吐槽或者是期待吧:

1、红米 Note 手机一部;

2、小米盒子增强版一块(像个圆圆的河流石,所以论块了,不过配的是三星的电视,最初并不太信任小米,故没直购电视)

3、小米路由器(内置 1T 硬盘,家里台式机,IBM笔记本和MacBookAir以及联想、红米、苹果等手机的照片自动备份上来,真是太帅了,之前买过一个 BT3 的开发版套了个小盒子,不过做起来确实有困难,最难不过电源管理)

4、小蚁摄像头(任何有 WIFI 的地方,用手机都能看到家里,并用手机实时对讲)

5、小米插座(用来控制三星电视的电源,这样任何一款电视,都被纳入到小米家族了,不过尚缺一个带学习功能的红外,也许只有 Arduino 能搞定了)

6、小米游戏手柄一对儿(玩儿了近两周了,游戏虽少,但确都很耐玩)

7、小米灯泡、小米体重称,一直在观注,多次马上要付款了,突然又放弃了,在我的思维中并没有答案,但我知道我的潜意识肯定有她的道理。

今儿个把小米盒子用手机数据线连接到 MacBookAir 上,稍加设置,就可以调试了:

一是打开电视中设置里的调试开关项;

二是直接运行时,电视上会提示,点允许就可以了;

想做点小东西,即能让小孩拿游戏手柄玩,又能以算术做为工具来玩,这个小东西,不知道叫啥,不知道咋分类,但我知道,首先得能识别到游戏手柄的各个按键才行,小米官方有按键码说明《电视/盒子应用开发指南》,不过对于我这很少用和记这些键码的人来说,这个确实用处不大,我还是直接获取到键码值,反馈出来让我自个儿知道就行了,这样能判断哪个键能识别到,哪个不能识别到,基本当下的任务就完成了。

先来看一下 Activity 响应按键按下事件的重载方法:

 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return super.onKeyDown(keyCode, event);}

super.onKeyDown(keyCode, event); 方法的实现 Anroid 源码如下节选:

    public boolean onKeyDown(int keyCode, KeyEvent event)  {if (keyCode == KeyEvent.KEYCODE_BACK) {if (getApplicationInfo().targetSdkVersion>= Build.VERSION_CODES.ECLAIR) {event.startTracking();} else {onBackPressed();}return true;}

当按下返回键时,目标版本大于 ECLAIR 即 SDK 2.1,就会执行

    event.startTracking();

翻译:在 Callback.onKeyDown 执行期间调用该方法,使系统跟踪当前键按下事件,直到结束(可能包含一个长按事件)。

注意,同时只能有一个键被跟踪 -- 如果在前一个键被跟踪的时侯收到了另一个键按下事件,前一个事件跟踪行为停止。

通过查看 Android 源码,你会发现

    return super.onKeyDown(keyCode, event);

    return super.onKeyUp(keyCode, event);

有一个配合点,下面贴 onKeyUp 源码就很容易看出来了:

    public boolean onKeyUp(int keyCode, KeyEvent event) {if (getApplicationInfo().targetSdkVersion>= Build.VERSION_CODES.ECLAIR) {if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()&& !event.isCanceled()) {onBackPressed();return true;}}return false;}

其中这一句

    keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()&& !event.isCanceled()

先判断是返回按键,然后判断该事件是否处于跟踪状态,即在 onKeyDown 中

    event.startTracking();

开启的跟踪状态,并且判断该事件对象未处于取消状态,那么符合这三个条件,就正好与 onKeyDown 配合上了,

当按键按下时,跟踪状态开启,一直没有其它按键按下的情况下,按键松开,通过系统跟踪的该按键事件状态,确定返回按键完成了一次完整的

按下松开,即执行 onBackPressed() ,源码如下 :

    public void onBackPressed() {if (!mFragments.popBackStackImmediate()) {finish();}}

该方法和 onKeyDown 方法中版本小于 SDK 2.1 时调用的是同一个,其中调用了 finish() 方法,即结束当前 Activity 。

由以上分析可以掌握最终返回按键的处理过程,如何结束当前 Activity 的,接下来要实现二次按返回键再关闭当前 Activity ,

先声明当前主线程下的 Handler:

 Handler handler=new Handler();

接下来重载 onKeyDown 方法

 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case 3:dealResult = dealWithHomeKey();break;case 4:dealResult = dealWithBackKey();break;default:break;}if (!dealResult) {finish();}return true;//return super.onKeyDown(keyCode, event);}

方法 dealWithBackKey() 处理返回按键,先声明类成员变量,用于记录状态

 boolean ifBack = false;boolean ifHome = false;boolean dealResult = false;long delayCancelInterval = 3000;

然后声明  dealWithBackKey() 方法进行处理

    boolean dealWithBackKey() {if (!ifBack) {// 响应按键设置取消标识,在被延迟取消前再次按返回键,则退出ifBack = true;// 延迟几秒取消返回标识handler.postDelayed(new Runnable() {@Overridepublic void run() {ifBack = false;}}, delayCancelInterval);Toast.makeText(this, "再按一下返回键,退出应用", Toast.LENGTH_SHORT).show();// 返回 true ,事件不再继续向上传递return true;}return false;}

或者单独声明 Runnable ,可以留出取消 Runnable 的余地,不过感觉用处不大,此处仅供技术参考

 Runnable delayCancelBack = new Runnable() {@Overridepublic void run() {ifBack = false;}};

再看看  dealWithBackKey() 方法

    boolean dealWithBackKey() {if (!ifBack) {// 响应按键设置取消标识,在被延迟取消前再次按返回键,则退出ifBack = true;// 延迟几秒取消返回标识handler.postDelayed(delayCancelBack, delayCancelInterval);Toast.makeText(this, "再按一下返回键,退出应用", Toast.LENGTH_SHORT).show();// 返回 true ,事件不再继续向上传递return true;}return false;}

对比一下,感觉后者能更好一些,相对清晰,且功能分离,随时可替换。

话说回来,无论是 Java 的匿名内部类还是 OC 的 Block ,作为一种先进的编程语言元素,并不是随处使用的,有节有度才能达到预期效果。

针对于上面的代码,感觉直接内嵌内部类要好些,毕竟逻辑不很复杂,如果逻辑非常复杂,不能作为当前被嵌入代码的简单扩展,那么,还是声明并用变量索引,然后再使用,相对能把两个复杂的逻辑范畴隔离开,引用的范畴内代码逻辑清晰,但注释一定要配合得当,才能很好地掩盖内部实现。

以上代码在小米盒子增强版运行通过,Android SDK 4.4.2, Mac Book Air 开发环境。
以上隐匿了一段代码,用于提示所按键的键码值,在 onKeyDown 重载方法开头部位:

     String logText = "onKeyDown - keyCode:"+keyCode;Log.d("Mi", logText);Toast.makeText(this, logText, Toast.LENGTH_SHORT).show();pressKeyTextView.setText(logText);

Home 键通过注册广播监听也是可以接收到了,但如何能拦截,让系统响应不到,这样在我的应用中按 Home 键,不回到桌面,还是没有解决。

下载了一些其它小米应用商店中的应用,有些确实是无法通过按 Home 回到桌面,尚不知是如何实现的,需要时可以考虑反编译一下,看看实现方式,当然了,仅是学习的目的。

待续......

Android 小米盒子游戏手柄按键捕获 - 能获取到的 home 键依然是个痛相关推荐

  1. 小米盒子投屏+android,小米盒子投屏神器

    小米盒子投屏神器是一款功能强大的手机投屏软件,小米盒子投屏神器提供视频投屏.游戏投屏.音乐投屏等功能,给你生活带来方便,喜欢快点投屏神器小伙伴赶紧下载使用吧. 快点投屏神器介绍 1.照片投屏,把您手机 ...

  2. 小米盒子4c android,小米盒子4/4C规格曝光 有一定升级

    小米在1月29日发布了小米盒子4/4C,分别售价349/249元,并且在官网公布了两款新电视盒子的配置. 三围尺寸.重量方面,小米盒子4.4c完全一致,只是配色有所不同(4为白色.4c为黑色).长宽厚 ...

  3. 小米盒子3增强版 android,小米盒子3增强版刷机包

    小米盒子3增强版刷机包,让广大用户可以轻松刷回1.4.6稳定版本,这款刷机包使用方便,只需要按照操作步骤即可顺利刷机,有需要的朋友赶快来下载体验吧! 刷机教程: 里面有2个文件下载下来放到u盘根目录下 ...

  4. 二代小米盒子评测:老用户升级意义不大

    在小米3手机和小米电视刚刚发布几天之后,新一代的小米盒子悄然登陆了小米官网,售价依旧为299元.与上一代产品相比,虽然全新的小米盒子在外观上并 没有发生任何改变,但硬件配置的提升还是多少让广大米粉们兴 ...

  5. 小米电视微信投屏出现服务器出错,小米盒子电视投屏显示101020错误是怎么回事...

    原因:小米盒子版本未升级. 小米盒子"101020"错误的解决方法: 1. 进入小米盒子的设置系统升级,确认盒子版本号大于等于1.1.53 (仅针对增强版小米盒子). 如果是小米电 ...

  6. 小米盒子 android tv,小米盒子3 MDZ-16-AA 降级及刷入Android TV系统

    小米盒子3 MDZ-16-AA 降级及刷入Android TV系统 来源于小米盒子3C的教程:https://rdma.co/mdz-16-aa/ 两者仅遥控按键不一样,其它硬件都是相同的. #### ...

  7. 小米盒子3增强版 android tv,小米盒子3增强版刷Android TV系统

    写在前面: 注意事项:1.一旦刷机完成,可能没有机会再刷回MIUI TV官方系统,且可能会失去保修,所以,请慎重决定! 请慎重决定! 请慎重决定! 2.有些图片我可能忘记拍摄,我会尽量补上 2019/ ...

  8. 小米盒子 android 动画特效,电视超人app下载

    小米电视超人软件是一款非常好用的手机投屏app,可以把手机上的电视剧.综艺.音乐以及相片轻松投屏到电视上,大屏观看效果更佳,如果你也喜欢的话,那就赶快下载体验吧! 官方介绍 电视超人是小米投屏神器的全 ...

  9. Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案

    Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案

最新文章

  1. 控件包含代码块,因此无法修改控件集合
  2. Linux 技术篇-使用vim命令创建、编辑文件内容实例演示,linux修改文档方法
  3. 【控制】《自动控制原理》胡寿松老师-第3章-线性系统的时域分析法
  4. C#+SQL Server数据库系统操作日志的实现完整案例
  5. 使用var声明的变量 和 直接赋值并未声明的变量的区别
  6. Exchange 2013SP1和O365混合部署系列一
  7. 预装Win8笔记本改重装Win7的方法
  8. 深度学习——Nesterov方法的学习笔记
  9. Windows 动态链接库
  10. ES6:Rest 参数和参数默认值【转】
  11. java入门、常量和变量
  12. docx文档怎么排列图片_怎么把图片文字转换成word文档
  13. php生成统计图类pchart---中文翻译手册
  14. 东南大学计算机学院分数线,“东南大学”2019本一批次专业录取分数整理!计算机、建筑领域实力强,又是985、211、双一流名校!...
  15. Python爬虫:给我一个链接,西瓜视频随便下载
  16. python文档生成_python文档生成工具:pydoc、sphinx;django如何使用sphinx?
  17. 【TopCoder SRM 551 Div2】Solutions
  18. 渗透测试之攻击Windows认证
  19. CnOpenData中国各省份官方报纸数据
  20. 3dmax面部表情绑定

热门文章

  1. python日历gui_用Python自动化生成爱豆日历
  2. java怎么写crud_Spring Boot 中 crud如何优雅的实现-附代码
  3. 大数据揭秘:科创板开张在即,开户者男性居多,70后更有实力
  4. 如何保存Win11自动锁屏壁纸?
  5. x299服务器芯片,谁说买新不买旧?2019年X299入坑
  6. 语音问答机器人小程序
  7. 1364 小Y的烦恼
  8. 宇宙代码与磁子计算机,“上天”还不满足,这些人居然想养个宇宙当宠物
  9. 小白运用SAI怎样上色?运用SAI上色有技巧嘛?
  10. 安卓入门项目-模仿某商城day02-仿拼多多搜索页面多列表联动