项目要求:该项目因为没有使用android5.0,导致启动bluetooth的蓝牙audio
slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制。UI界面是通过图形选择或者一个kpd组合按键来打开关闭或者是启动蓝牙搜索功能。

1,用户按键的侦測:

标准的行为,用户的组合按键,kernel里面向上层发送scancode,然后framework把scancode转换成keycode的keyevent,该keyevent会被PhoneWindows接受并处理。

对于mtk,从按键到keycode,已经被封装起来。这个封装的工具就是dct.

比如。我们的项目组合按键是:KCOL2+KROW1,我们能够在图形工具中如选择我们的配置

在样例中,我们设置该案件的keycode是SYM

当然,也能够自定义新的keycode。我嫌麻烦,就直接使用现成的,怎样定义新的按键,请看附录:

2,侦測用户按键行为,发送对应的intent

上面的keycode在发送到各个window之前。是被PhoneWindowManager.java接收到的,在当中有一个方法:

@Override

public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, booleanisScreenOn) {

望文生义。看名字我们就知道这个函数的作用。

我们在代码中例如以下拦截:

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

}

return 1;

}

当然,KEYCODE_SYM是原来系统中已经定义的keycode,事实上就是输入法的选择,我们须要屏蔽这个功能。在alps/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java:

/**

* @hide

*/

public voiddispatchKeyEvent(Context context, int seq, KeyEvent key,

FinishedEventCallback callback) {

booleanhandled = false;

/*zcfdebug--<<

synchronized(mH) {

if(DEBUG) Log.d(TAG, "dispatchKeyEvent");

if(mCurMethod != null) {

if(key.getAction() == KeyEvent.ACTION_DOWN

&& key.getKeyCode() == KeyEvent.KEYCODE_SYM) {

showInputMethodPickerLocked();

handled = true;

}else {

try {

if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod);

final long startTime = SystemClock.uptimeMillis();

enqueuePendingEventLocked(startTime, seq, mCurId, callback);

mCurMethod.dispatchKeyEvent(seq, key, mInputMethodCallback);

return;

} catch (RemoteException e) {

Log.w(TAG, "IME died: " + mCurId + " dropping: "+ key, e);

}

}

}

}

zcfdebug-->>*/

callback.finishedEvent(seq, handled);

}

凝视掉原有功能就好了。

依照我们的项目定义,按键3-5秒为蓝牙状态电源打开搜索功能,长按8秒以上为关闭。

关闭的时候,长按8秒没有不论什么动作。

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

//lastSymKeyDownTime=System.currentTimeMillis();

lastSymKeyDownTime=event.getEventTime();

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime;

//SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime;

Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime);

if(SymKeyPressTime>2000&& SymKeyPressTime<5000){

Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!");

}

if(SymKeyPressTime>7000){

Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!");

}

}

return 1;

}

蓝牙开关等动作,我们在外边的apk程序中实现。我们仅仅要发送intent实现就OK了,代码例如以下:

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

//lastSymKeyDownTime=System.currentTimeMillis();

lastSymKeyDownTime=event.getEventTime();

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime;

//SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime;

Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime);

if(SymKeyPressTime>2000&& SymKeyPressTime<5000){

Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!");

Intent btStartStopIntent = new Intent(BT_STARTSTOP);

mContext.sendBroadcast(btStartStopIntent);

}

if(SymKeyPressTime>7000){

Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!");

Intent btPairIntent = new Intent(BT_PAIR);

mContext.sendBroadcast(btPairIntent);

}

}

return 1;

}

应用程序怎样接收处理intent,将在下一篇文章描写叙述

附录:Howto add a new key on android ICS\ICS2:

[Description]

How to add a new keyon android ICS/ICS2

[Solution]

1.在DCTtool keypad list
文件添加新按键的选项

alps\mediatek\source\dct\Keypad_YuSu.cmp中加入新键,如SMS快捷键

KEY_SYM

KEY_SMS

KEY_0

2.打开DCTtool
在keypad矩阵中在对应定义的按键位中加入新按键,如SMS,然后Save

3.改动linux键盘码文件input.h

因为preloader\uboot\kernel\factory等情况分开使用,对应的文件路径下的input.h都应该改动

为新按键添加键码值

kernel\include\linux\input.h

bionic\libc\kernel\common\linux\input.h

external\kernel-headers\original\linux\input.h

external\qemu\linux_keycodes.h

mediatek\plaform\mt6575\preloader\src\drivers\inc\linux\input.h

Mediatek\plaform\mt6575\uboot\inc\linux\input.h

如KEY_SMS

#define KEY_SMS 252

4.添加keypadlayout文件键盘映射,linux和androidkey映射

mediatek\config\<projectname>\mt6575-kpd.kl

如:

key 252 SMS

当中252是linux键码,SMS是android识别key值假设是须要唤醒系统,还须要添加WAKE

假设新按键是全键盘的一些生僻字符,改动:mediatek\config\<project
name>\mt6575-kpd.kcm

5.改动Java识别keycode

framework/base/include/ui/KeyCodelabels.h

KEYCODES数据结构后面添加

{"SMS",220}

framework/base/native/include/android/KeyCodes.h

在按键定义项添加AKEYCODE_SMS = 220;

6.改动Java键盘事件

framework/base/core/java/android/view/keyevent.java

/**

*@hide

*/

public static finalint KEYCODE_SMS =220;

最后的按键为新增的

private static finalint LAST_KEYCODE ==KEYCODE_SMS;

以上/**/凝视的code是android非开放API或变量定义的时候,须要加入JavaDoc的识别,否则要运

行makeupdate-api才干build通过

假设是系统按键,改动framework/base/libs/ui/input.cpp

isSystemKey()添加caseAKEYCODE_SMS:

7.改动XML文件描写叙述符framework/base/core/res/res/values/attr.xml

<enumname="KEYCODE_SMS" value="220" />

8.添加測试验证log在android

framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java

在interceptKeyBeforeDispatching()添加

if(keycode==KeyEvent.KEYCODE_SMS){

log.d(TAG,"interceptKeyTi KEYCODE_SMS keyCode="+ keyCode + "down=" + down + "

repeatCount=" +repeatCount + “ keyguardOn=” + keyguardOn + “ mHomePressed=”+

9.能够抓log确认,或者添加測试APK检測

Kernal log:

<4>[253.828234]kpd:register = fffe ffff ffff ffff ff

<4>[253.828825]kpd:(pressed) HW keycode = 0

<4>[253.829348]kpd:report Linux keycode = 252

<4>[253.829857]kpd:save new keymap state

<4>[254.030814]kpd:register = ffff ffff ffff ffff ff

<4>[254.031405]kpd:(released) HW keycode = 0

<4>[254.031936]kpd:report Linux keycode = 252

<4>[254.032445]kpd:save new keymap state

Android log:

WindowManager:interceptKeyTq keycode=220 screenIsOn=true keyguardActive=false

policyFlags =#2000000 down =false canceled = false

D WindowManager:interceptKeyTi keyCode=220 down=false repeatCount=0 keyguardOn=false

mHomePressed=falsecanceled=false

D WindowManager:interceptKeyTi KEYCODE_SMS keyCode=220 down=false repeatCount=0

keyguardOn=falsemHomePressed=false canceled=false


版权声明:本文博主原创文章。博客,未经同意不得转载。

mtk硬件项目开始关闭蓝牙功能:mtk 硬件ScanCode和keycode应用演示示例的更多相关文章

  1. 微信小程序开发-蓝牙功能开发

    0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...

  2. [TPYBoard-Micropython之会python就能做硬件 7] 学习使用蓝牙模块及舵机

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi            欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板  一块 2 ...

  3. 记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

    开发目标: (1) 对于Android手机,直接通过微信小程序调用手机的NFC功能,对15693协议的芯片进行读写操作: (2)对于苹果手机(及没有NFC模块的手机),通过微信小程序的蓝牙功能连接到蓝 ...

  4. 微信小程序调用蓝牙功能控制车位锁

    第一次学用微信小程序,项目需要,被逼着研究了一下,功能是调用微信小程序的蓝牙功能,连接上智能车位锁,控制升降,大概步骤及调用的小程序接口API如下: 1.打开蓝牙模块 wx.openBluetooth ...

  5. iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)

    一.前言 iOS开发更新APP我觉得是比较坑的就是审核时间比较长,审核比较严,对于刚入行的小伙伴来说,雷区比较多:所以热更新是比较重要的: 大家也许会发现我们常用的QQ现在下来也就一百多兆,但是用了几 ...

  6. 海美迪Q5智能机顶盒的蓝牙功能

    虽然在硬件上,海美迪Q5智能机顶盒没有集成蓝牙模块,但是在软件系统上,Q5是支持蓝牙驱动的,所以它可以通过USB外接蓝牙适配器来扩展出蓝牙功能,简单来说,就是你另外买个蓝牙适配器,插到Q5上面,就能用 ...

  7. 经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

    说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后, ...

  8. 调用手机端硬件功能 汇总(android/ios) Native.js示例汇总

    Native.js示例汇总 NJS Native.JS 示例 Native.js虽然强大和开放,但很多web开发者因为不熟悉原生API而难以独立完成.这篇帖子的目的就是汇总各种写好的NJS代码,方便w ...

  9. 在Linux系统中使用蓝牙功能的基本方法

    首先确定硬件上有支持蓝牙的设备,然后运行如下命令,就可以开到我们的蓝牙设备了: lsusb 运行hciconfig可以看到:从上图可以看出,我们的蓝牙设备是hci0运行hcitool dev可以看到我 ...

随机推荐

  1. Unity3D游戏开发之开发游戏带来的问题

    昨日曾就某投资人把移动团队失败原因之中的一个归于选择Unity引擎进行了一番评论,工具本身无罪,但怎样理解工具.正确使用Unity引擎确实须要讨论,在选择Unity之前你也许须要了解下这个引擎实际开发 ...

  2. 沙朗javascript总结一下(一)---基础知识

    我也听说过Javascript这东西.我一直感觉很神奇,但它并没有去太懂.今天,牛腩哥哥随后的初步研究,一些浅显的认识.就先总结一下. 首先,什么是javascript? javascript是一种直 ...

  3. iphone开发中数据持久化之——模型对象归档(二)

    在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...

  4. hdu5171(矩阵快速幂)

    传送门:GTY's birthday gift 题意:GTY的朋友ZZF的生日要来了,GTY问他的基友送什么礼物比较好,他的一个基友说送一个可重集吧!于是GTY找到了一个可重集S,GTY能使用神犇魔法 ...

  5. 【CSS3】transform-origin原点旋转

    忙乱, 点 -moz-transform-origin: 0 0; -webkit-transform-origin:0 0; -o-transform-origin:0 0; 以右上角给原点 -mo ...

  6. Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框

    现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...

  7. WPF界面设计技巧(10)-样式的继承

    原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...

  8. C++基础学习教程(八)

    转载请注明出处:http://blog.csdn.net/suool/article/details/38300117 引入 在进行下一步的学习之前,我们须要厘清几个概念. RAII 首先介绍一个编程 ...

  9. sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    在使用Hibernate的J2EE项目中,莫名其妙出现如上错误,既不报错,也不运行不论什么输出測试代码,更不返回结果. 经过排查,在方法里面引用的实体类和其映射文件属性个数不一致. 改动一致后,即解决 ...

  10. hdu 1251 字典树模板题 ---多串 查找单词出现次数

    这道题题目里没有给定数据范围 我开了2005  疯狂的WA 然后开了50000, A掉  我以为自己模板理解错  然后一天没吃饭,饿得胃疼还是想着把这题A掉再去吃,谁知竟然是这样的问题,,,呵呵~~~ ...