按键输入有三种:system key  音量键

global key 按下启动某个APP

user key  ABCD...

给安卓应用程序定义一个广播接收者,写一个BroadcastReceiver的子类:

  1. public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Get BroadcastReceiver",Toast.LENGTH_SHORT).show();
    Intent intent1 = new Intent(context, MainActivity.class);
    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent1);
    }
    }
    在.xml文件里定义接收的按键是GlobalKey:
  1. <receiver android:name=".MyBroadCastReceiver">
    <intent-filter android:priority="20">
    <action android:name="android.intent.action.GLOBAL_BUTTON"/>
    </intent-filter>
    </receiver>
    然后使用am命令发广播:am broadcast -a android.intent.action.GLOBAL_BUTTON -n com.example.zhu.zhu_first/.MyBroadCastReceiver
  2.  
  3. 可以使用按键启动APP:

修改global_keys.xml:

<key keyCode="KEYCODE_TV" component=" com.example.zhu.zhu_first/.MyBroadCastReceiver " />

编译安卓系统生成frameworks-res.apk

放到/system/framework/下面

/system只读,重新挂载:

Mount -o remount,rw /system

Cat /proc/mounts 查看挂载情况

虚拟按键驱动:

  1. #include <linux/kernel.h>
  2. #include <linux/slab.h>
  3. #include <linux/module.h>
  4. #include <linux/init.h>
  5. #include <linux/hid.h>
  6.  
  7. static struct input_dev *inputdev;
  8.  
  9. static int input_init(void)
  10. {
  11. int i;
  12. inputdev = input_allocate_device();
  13.  
  14. set_bit(EV_KEY,inputdev->evbit);
  15. set_bit(EV_REP,inputdev->evbit);
  16. for (i = ; i < BITS_TO_LONGS(KEY_CNT); i++)
  17. inputdev->keybit[i] = ~0UL;
  18. inputdev->name = "virtualInput";
  19. inputdev->id.bustype = ;
  20. inputdev->id.product = ;
  21. inputdev->id.version = ;
  22. inputdev->id.vendor = ;
  23. input_register_device(inputdev);
  24. return ;
  25. }
  26.  
  27. static void input_exit(void)
  28. {
  29. input_unregister_device(inputdev);
  30. input_free_device(inputdev);
  31. }
  32.  
  33. module_init(input_init);
  34. module_exit(input_exit);
  35.  
  36. MODULE_LICENSE("GPL");

加载驱动:

然后使用sendevent /dev/input/event5 1 377 1   //按下

sendevent /dev/input/event5 1 377 0       //松开

sendevent /dev/input/event5 0 0 0       //同步

发送AKEYCODE_TV到app

也可以不使用虚拟按键驱动:

直接使用 input keyevent TV   按下AKEYCODE_TV

按键扫描输入与真实输入之间的映射关系通过修改.kl和.kcm两个配置文件来决定

3种配置文件:(通过串口修改安卓系统,然后重启开发板)

1、IDC:input Device configure

/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc

/system/usr/idc/Vendor_XXXX_Product_XXXX.idc

/system/usr/idc/DEVICE_NAME.idc

/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc

/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc

/data/system/devices/idc/DEVICE_NAME.idc

2、Keylayout      //XXXX : 4位16进制

inputdev->id.product = 2;

inputdev->id.version = 1;

inputdev->id.vendor  = 3;

--> Vendor_0003_Product_0002_Version_0001.kl

按照顺序查找这8个配置文件,然后使用。如果没有配置文件,就使用默认的,与linux内核按键值一一对应。创建好配置文件之后一定记住修改访问权限 chmod 777 Vendor_0003_Product_0002_Version_0001.kl

chmod 777 keylayout/

chmod 777 devices/

/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl

/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl

/system/usr/keylayout/DEVICE_NAME.kl   //input_dev->name

/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl

/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl

/data/system/devices/keylayout/DEVICE_NAME.kl

/system/usr/keylayout/Generic.kl

/data/system/devices/keylayout/Generic.kl

3、KCM: key character map

/system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm

/system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm

/system/usr/keychars/DEVICE_NAME.kcm

/data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm

/data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm

/data/system/devices/keychars/DEVICE_NAME.kcm

/system/usr/keychars/Generic.kcm

/data/system/devices/keychars/Generic.kcm

/system/usr/keychars/Virtual.kcm

/data/system/devices/keychars/Virtual.kcm

使用GlobalKey启动APP的更多相关文章

  1. [Android]从Launcher开始启动App流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码 ...

  2. ActivityManagerService是如何启动app

    ActivityManagerService是如何启动app 一.      上一篇文章app的启动过程,说明了launcher启动app是通过binber,让ActivityManagerServi ...

  3. Appium学习路—脚本篇(启动app)

    启动之前的准备   1.脚本执行前,需要先启动appium的server端, 启动server方法: 打开appium客户端,点击右上角的Launch     2.iOS的测试只能在mac本上做   ...

  4. Android Launcher分析和修改9——Launcher启动APP流程

    本来想分析AppsCustomizePagedView类,不过今天突然接到一个临时任务.客户反馈说机器界面的图标很难点击启动程序,经常点击了没有反应,Boss说要优先解决这问题.没办法,只能看看是怎么 ...

  5. Android 启动APP黑屏解决方案

    #Android 启动APP黑屏解决方案# 1.自定义Theme //1.设置背景图Theme <style name="Theme.AppStartLoad" parent ...

  6. Android在浏览器启动APP

    要想在浏览器启动APP的方法例如以下: 在须要跳转的ACTIVITY中加入intent-filter的相关信息: <intent-filter>     <data android: ...

  7. ele.me在IOS浏览器端启动APP的技巧分析

    ele.me在IOS浏览器端启动APP的技巧分析 巧妙利用后台重定向,在schemes启动时提示用户打开,启动不了APP时能够及时跳转至下载页面. 避免报错页面的出现以及用户还没来的及选择就跳转到下载 ...

  8. appium+Python 启动app(二)

    我们上步操作基本完成,下面介绍编写Python脚本启动app 打开我们pycharm新建.py文件 第一步:输入Python脚本代码: #coding=utf-8 from appium import ...

  9. appium+Python 启动app(一)

    当我们appium和Python环境都配置好了,如何启动我们第一个app呢?下面介绍appium+Python启动app的操作步骤,为了能够详细查看,我们这里使用夜游神模拟器进行示范. 测试项目:QQ ...

随机推荐

  1. Eclipse 无法编译,提示“错误: 找不到或无法加载主类”

    jar包问题: 1.项目的Java Build Path中的Libraries中有个jar包的Source attachment指为了一个不可用的jar包, 解决办法是:将这个不可用的jar包remo ...

  2. golang 安装 guru vscode 安装失败

    1.先从git上复制下来 git clone https://github.com/golang/tools 2.再$GOPATH/bin中安装 go install golang.org/x/too ...

  3. MySql接口API函数综述

    C API函数概述 函数 描述 mysql_affected_rows() 返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. mysql_autocommit() 切换 a ...

  4. GO语言(四)线程通信

    package main import "fmt" func fibon(c,quit chan int) { x,y := , for { select { case c < ...

  5. OC基础数据类型-NSArray

    1.数组的初始化 NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @&quo ...

  6. 如果把PNG、JPG、BMP和GIF文件批量转换为ICO文件?

    有时候需要将大量的图片文件(比如PNG.JPG.BMP和GIF文件)批量转换为ICO图标文件,如果一个一个操作,非常费时间.本文将介绍如何用Dr. Folder软件快速批量转换图片文件为ICO图标文件 ...

  7. 关于token,session,cookie的概念和区别

    记录几篇讲的比较好的文章 https://www.cnblogs.com/moyand/p/9047978.html https://blog.csdn.net/wabiaozia/article/d ...

  8. Path模块部分常用函数解析——NodeJS

    官网地址:https://nodejs.org/api/path.html path.resolve([...paths])# Added in: v0.3.4 参数[...paths]: <S ...

  9. webConfig详细跳转配置.[转]

    站更换域名,把旧域名用301指到新域名来. 从iis中设置url永久转向就可以,看上去很容易,用了一会儿才发现,参数都没有带上. 从微软网站上找到如下说明,果然好使: 重定向参考 (IIS 6.0,7 ...

  10. Android(java)学习笔记208:Android下的属性动画高级用法(Property Animation)

    1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画 ...