需求分析

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

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

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

需求1的解决思路

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

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

将我们的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界面。我们想到的方法是

受360一款智键产品的启发,想到可以借助android的系统广播,比如智键这款产品的思路就是利用插入耳机时,会产生一个插入耳机的系统广播,然后我们自定义一个广播接收器,接收这个广播,加入跳转到Settings的逻辑,从而实现Settings程序的跳转。

第二种思路是,因为嵌入式终端上预留了一个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.policy

include $(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 usb键盘监听,android设备外接键盘实现监听事件相关推荐

  1. android设备外接键盘实现监听事件

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

  2. 笔记本键盘、触摸板、外接键盘没反应

    今天,突然笔记本键盘.触摸板突然失效,无法输入,连外接键盘都无效 网上搜了一下,解决了,不知道原因是什么? 现象: 1. 笔记本键盘和触摸板失效,无法输入和移动指针 2. 外接键盘也没用,但是外接鼠标 ...

  3. Android usb 控制传输,【android之USB通信】android之USB数据传输-Go语言中文社区

    因为老板认为wifi连接的方式传输数据太慢,想通过USB传输来实现与硬件的连接,所以通过android客户端作为主设备,终端硬件作为从设备.其中收到数据的处理和 下发设置帧的生成与wifi连接的方式都 ...

  4. android usb 以太网,如何在Android智能手机上通过USB-OtG使用连接USB的有线以太网适配器?...

    由于我的专业知识,我经常不得不经常连接到仅连接LAN的有线设备(如管理型交换机,路由器,机顶盒等),以通过Telnet / SSH / HTTP访问其配置接口.无论走到哪里,我都对随身携带笔记本电脑的 ...

  5. android usb弹窗权限r,Android USB权限对话框永远不会出现

    我写了一个简单的应用程序,通过USB将命令发送到连接到Android 4.0平板电脑的USB打印机.出于某种原因,我无法获得声明接口和打开连接的权限.这是相关的代码: public class Tes ...

  6. android+usb转串口+唯一id,Android平台3G模块驱动移植-USB转串口

    Android平台3g模块是通过ril库来支持数据.短信.彩信.电话.第三方通话.USSD等功能的.其相应的组件有:rild用来为rild socket建立文件,pppd和chat为拨号文件,libr ...

  7. android usb wifi驱动下载,android 平台USB wifi驱动移植及使用

    一.   Android平台Wifi的基本代码路径 1.       Wpa_supplicant源码部分 external/wpa_supplicant_6/ 生成库libwpa_client.so ...

  8. android usb卸载不了,Android 安全卸载U盘的方法

    这今天项目中有一个将设备的数据文件复制到U盘的功能,复制完成之后,在设备看U盘的文件都是好的,数据也正常,当拔出U盘后放到电脑上,有时就会出现文件为0B的情况,后来才发现,是U盘没有安全卸载的原因. ...

  9. android+usb模拟点击,Android后台模拟点击探索(附源码)

    工作中我们需要自制一套工具,其中遇到需要模拟点击事件的需求,类似按键精灵的功能,支持后台持续运行,满足触发条件时完成点击. 经过一番探索,一共整理出两种不同的方案:AccessibilityServi ...

  10. android usb共享代码,让Android手机具有USB网络共享功能,可以通过USB连接到Internet...

    第0章: 什么是USB网络共享功能 最近漫游Windows Phone的世界时,最新鲜的感觉之一就是诺基亚Lumia手机具有有趣的USB绑定功能,该功能使您的手机可以通过USB电缆连接到计算机,您可以 ...

最新文章

  1. 针对杂乱环境下抓取物体的机器人学习
  2. 阿里资深技术专家:在各阶段中,3年经验的程序员应具备哪些技术能力(进阶必看)...
  3. Visual Studio 2013开发 mini-filter driver step by step 获取可执行文件名称 - 实现process monitor的一个功能 (10)
  4. docker部署rocketmq
  5. andriod的apk文件相关的编译反编译工具
  6. .NET6之MiniAPI(二十九):UnitTest
  7. turtle 函数 方法_学python第十一节:turtle深入 了解
  8. RAC数据库后台进程介绍
  9. Go程序:演示复数类型的用法
  10. PAT Basic 1011
  11. Hive中Join的 MR 底层原理
  12. 非常可乐——BFS搜索最少次数
  13. 解决在Word安装Mendeley失败,提示“错误429:activex部件不能创建对象“问题
  14. 哔哩哔哩2020校园招聘游戏测试笔试卷(二)知识点解析
  15. #ncbi #blast
  16. 电子元器件贸易采购管理常见难题及解决方案
  17. GauGAN v2:两个词生成风景画
  18. 无界键鼠(MouseWithoutBorders)的安装与无法连接的解决方案
  19. 七倍压电路图_倍压整流电路图大全(九款倍压整流电路设计原理图详解)
  20. 未越狱iPhone访问限制密码忘了怎么办

热门文章

  1. yasm linux gcc,yasm安装出现问题
  2. 函数类型+WINAPI+函数名
  3. 深海迷航坐标传送代码_深海迷航全资源坐标一览 美丽水世界坐标位置介绍
  4. Nessus插件包20220925
  5. 百度经纬度转GPS经纬度
  6. 企业微信 java_java企业微信开发之通讯同步
  7. 【多目标追踪算法】多目标跟踪评价指标
  8. PICKIT3 WIN10无法识别问题
  9. mbedtls 探索
  10. 网络高清视频远程会议系统EasyRTC在Windows10上运行程序无返回信息问题解决