需求分析

产品为一款基于android的交互终端,现在已经在android嵌入式系统上运行了一个第三方的交易软件(没有源码)。在产品量产投入使用时,可以实现以下两点需求:

  1. 设备开机时自动启动交易App。

  2. 由于产品投入市场之前,需要对系统的Framework进行定制,屏蔽设备的状态栏,这样如果不借助其他设备,我们就无法退出到系统的Launcher进行其他操作,但为了方便现场开发人员调试,有时候需要打开系统的Setting,希望可以找到一种通过某种方法调出系统Setting的方法。

需求1的解决思路

针对需求1,解决思路为:

(1)自己创建一个App,在Manifest.xml文件下加入:

<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.MONKEY"/>
<category android:name="android.intent.category.DEFAULT"/>

将我们的App提升为系统Launcher级别的App。

(2)获取第三方的交易软件的包名方法为打开第三方交易软件App,利用Adb工具输入指令:adb shell dumpsys activity | grep mFocusedActivity会打印出类似下面的内容:
mFocusedActivity: ActivityRecord{42ddcd78 u0 com.android.mms/.ui.ConversationList t3}

即可得到返回栈栈顶,及当前活动的Acitivity的信息,信息为包名+活动名。获得包名和活动名之后,我们就可以得到完整的跳转代码,形式如:

Intent mIntent = new Intent();
ComponentName mComp = new ComponentName("包名", "活动名");
mIntent.setComponent(mComp);
mIntent.setAction(Intent.ACTION_VIEW);
startActivity(mIntent);

重写App的onCreate()和onResume()方法,加入上述跳转代码,即可完成开机时先自启自定义的App,然后自动跳转到第三方的交易软件。

(3)重写App的onCreate()和onResume()方法,加入上述跳转代码,即可完成开机时先自启自定义的App,然后自动跳转到第三方的交易软件。

需求2的解决思路

针对第二个需求,找到一种方法,可以在运行交易软件的时候,通过某种方式调出系统Settings界面。我们想到的方法是

  1. 受360一款智键产品的启发,想到可以借助android的系统广播,比如智键这款产品的思路就是利用插入耳机时,会产生一个插入耳机的系统广播,然后我们自定义一个广播接收器,接收这个广播,加入跳转到Settings的逻辑,从而实现Settings程序的跳转。
  2. 第二种思路是,因为嵌入式终端上预留了一个USB接口,可以利用这个接口,插入一个usb键盘,我们可以自定义一个键盘监听事件,比如按Ctrl+Alt+G时,便可以跳转到Settings。

我们采用了第二种外接usb键盘实现跳转的方式。

但是,因为交易软件是第三方提供的,没有源码,不可能修改它完成键盘事件的监听,我们想到可不可以单独写一个服务来监听前台的键盘时间,然后实现跳转,但是感觉这种思路是不可能实现的,假如可以实现监听,那么我们运行一些App在输入密码的时候,这些信息不就被轻而易举的监听到了吗?后来证实了自己的假设,底层屏蔽了服务监听键盘事件的方式。那我们只能采取修改android系统的Framework层代码来实现键盘监听了。

首先需要了解andorid的键值上报流程,这里就不展开介绍了,直接说解决方案。首先,在android源码包下找到/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件,文件里有一个方法interceptKeyBeforeDispatching(),方法名翻译成中文可以理解为在分发之前完成键值的拦截。通过在这个方法中加入我们的逻辑,就可以实现外接键盘实现程序Settings的跳转了。
在函数中添加下面的代码:

/*** launch Setting:Ctrl+Alt+G*/
if(event.isCtrlPressed() && event.isAltPressed() && keyCode == KeyEvent.KEYCODE_G && event.getAction() == KeyEvent.ACTION_UP)
{Log.d(TAG,"---Ctrl+Alt+G is pressed---");Intent mIntent = new Intent();ComponentName mComp = new ComponentName("com.android.settings", "com.android.settings.Settings");mIntent.setComponent(mComp);mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);mIntent.setAction("android.intent.action.MAIN");mContext.startActivity(mIntent);return -1;
}

意思是,当Ctrl+Alt+G键同时按下时,会完成应用程序的跳转,跳转到android 的Settings程序。关于如果监听组合按键可以参考这篇文章:
android中捕获组合键

完成后,保存打开终端,先将目录切换到android源码包下,执行

$source build/envsetup
$lunch

然后将目录切换到/frameworks/base/policy/,发现下面有个Android.mk文件,我们打开这个文件,看源码:

LOCAL_PATH:= $(call my-dir)`
# the library
# ============================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_MODULE := android.policyinclude $(BUILD_JAVA_LIBRARY)
# additionally, build unit tests in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))

注意这两句话:

LOCAL_MODULE := android.policy
include $(BUILD_JAVA_LIBRARY)

意思是,编译后生成的文件名称叫做android.policy扩展名为.jar
然后我们在终端中输入mm单独编译模块。
生成的文件android.policy.jar保存在android/out/target/product/system/framework下面。我们可以直接连接设备把它push进我们的设备里,但是直接push存在一个问题,就是无法覆盖掉原有的文件。我们需要删除掉系统原来的android.policy.jar文件,然后再把它push进去。方法为:

adb remount
adb shell
cd system/framework
rm android.policy.jar
exit
adb push /home/A64/andoroid/out/target/product/system/framework/android.policy.jar /system/framework

然后重启设备后,就发现外接键盘可以满足需求了。因为状态栏被屏蔽了,如果需要执行back键,只需要按下键盘的Esc键盘,android系统已经帮我们写好了。

android设备外接键盘实现监听事件相关推荐

  1. ROS中 Python/C++ 键盘按键监听事件

    ROS中 Python/C++ 键盘按键监听事件 这几天在肝全国智能驾驶大赛,真就挺累的:抓狂思考,手搓代码,疯狂编译,要命运行.在这趟火车上,被各种各样的问题卡住甚至卡死,就很难受好吧.至今,我深深 ...

  2. Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序

    很多时候只是要暂停一下或只想关闭监听,并不想把程序关闭. 但是网上搜了半天,没有找到,然后自己就去翻了翻源码,发现了. 开启监听是: HookMouse()和HookKeyboard() 暂停监听是: ...

  3. Android开发心得-ListView的监听事件

    Android开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个 1.OnItemClickListener  2.OnTou ...

  4. android 常用的监听器,Android中的Keyboard监听事件

    前言 有关Keyboard监听事件,无非就是以下这几种情况: 1,操作显示或隐藏键盘: 2,判断当前键盘的状态: 3,键盘显示或隐藏后的拦截处理: 只要有使用到EditText,避免不了肯定会遇到以上 ...

  5. Android键盘监听事件

    本文档为个人博客文档系统的备份版本.作者:小游.作者博客:点击访问 我们想实现安卓键盘弹起和隐藏的监听事件,可以使用下面这个方法. 自己新建一个java文件,内容如下: public class So ...

  6. 对EditText的软键盘进行监听-----android:imeOptions

    在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下一项.搜索.发送或其他功能,这就需要开发者对软键盘回车的点击事件进行 ...

  7. android listview分区域监听,listview的监听事件

    package JAVASwing;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionE ...

  8. 常用的监听事件(android)

    刚发布过Toast,为了是自己记得牢固一些在这里写几个监听事件 分别写出不同位置的Toast 监听常用的有四种 第一种:内部类作为事件监听器类 xml中代码 <RelativeLayout xm ...

  9. Android——监听事件总结

    各种监听事件 1.按钮 Button (1)点击监听 btn_1.setOnClickListener(new View.OnClickListener() { (2)长按监听 btn_1.setOn ...

最新文章

  1. python打破循环_python – 为什么“c.execute(…)”打破循环?
  2. 活动丨突变!人工智能时代的产品经理
  3. 5.2 计算机网络之传输层UDP协议
  4. 属于服务器端运行的程序_Telerik UI for ASP.NET MVC:为任何设备以两倍的速度构建功能丰富且响应迅速的web应用程序...
  5. 一个简单的Kafka Flink Rabbitmq Demo
  6. python行业数据分析_python在数据分析
  7. jq为a标签绑定的onclick事件在移动端不响应
  8. 用session做权限控制
  9. 省选专练之数学 BZOJ2820 YY的GCD
  10. 培根密码加解密(Python)
  11. 笔记本可以跑虚拟机吗_什么笔记本跑虚拟机不卡?
  12. 《科技日报》:神州控股、神州信息、神州数码集团携手合力打造 “神州信创云”正式启航
  13. 卷积神经网络以及经典网络模型的浅谈
  14. linux下阅读MHT文件
  15. TenorFlowJS-激活函数
  16. 位运算以及位运算的应用
  17. 激光投影电视和液晶电视哪个好 激光投影电视和液晶电视什么区别
  18. jQuery :一个 JavaScript 库
  19. 2022年上海临港新片区科技小巨人(含培育)专项申报工作的通知
  20. 前端面试之---link 引入css文件和@import引入css文件的区别

热门文章

  1. PAT1014 福尔摩斯的约会 分数 20
  2. 阿里云推出全球应用加速解决方案,快速提升跨域应用访问体验
  3. 微信公众号关键词自动回复文件设置教程
  4. python实现AI抠图
  5. 正则表达式中级应用(java语言版)
  6. 大学在校 计算机考试,大学必考证书 | 计算机考试报名要开始啦!
  7. moment的使用在vue项目中的使用 (亲测有效)
  8. gem5 GPGPU-Sim 安装踩坑笔记
  9. 现代电子计算机元件的发展从电子管,现代计算机技术的发展方向与趋势探索
  10. 市场调研—全球及中国细胞模型行业研究及十四五规划分析报告