1.MTK平台耳机检测原理简介
1.1EINT+AuxADC
1.2.ACCDET
1.3.EINT_ACCDET
耳机按键
单键耳机实现播放,暂停
alps\mediatek\platform\mt6572\kernel\drivers\accdet下accdet.c 函数check_cable_type中case MIC_BIAS:下添加如下代码:
if(call_status == 0)
{
if(is_long_press())
{
ACCDET_DEBUG("[Accdet]send long press remote button event %d \n",ACC_END_CALL);
notify_sendKeyEvent(ACC_END_CALL);
} else {
ACCDET_DEBUG("[Accdet]send short press remote button event %d\n",ACC_MEDIA_PLAYPAUSE);
notify_sendKeyEvent(ACC_MEDIA_PLAYPAUSE);
}
}
if(call_status != 0)
{
if(is_long_press())
{
ACCDET_DEBUG("[Accdet]send long press remote button event %d \n",ACC_MEDIA_PREVIOUS);
notify_sendKeyEvent(ACC_MEDIA_PREVIOUS);
} else {
ACCDET_DEBUG("[Accdet]send short press remote button event %d\n",ACC_MEDIA_PLAYPAUSE);
notify_sendKeyEvent(ACC_MEDIA_PLAYPAUSE);
}
}
备注:KEY_****相关宏都定义在input.h文件中
KEY_PREVIOUSSONG:上一曲
实现下一曲(在框架层)
有些耳机只有一个按键, 需要通过一个按键来实现播放,暂停,下一首,上一首的功能
功能定义:
单击: 播放/暂停
双击: 下一首
三击: 上一首
[SOLUTION]
完整方案如下,只需要修改 phoneWindowManager.java
1: 加入定义:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> preLastHeadsethookDownTime=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,preLastHeadsethookUpTime=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, lastHeadsethookDownTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, lastHeadsethookUpTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> thisHeadsethookDownTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, thisHeadsethookUpTime = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clickCount = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
2:加入方法:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">sendHeadsetBroadcast</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clickCount){ Log.d(TAG,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"clickCount="</span>+clickCount); KeyEvent <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span>(clickCount){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime,KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">default</span>: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KeyEvent(thisHeadsethookUpTime,thisHeadsethookDownTime,KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>; } Log.d(TAG,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"keycode = "</span>+<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>.getKeyCode()); Intent intent = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Intent(); intent.setAction(Intent.ACTION_MEDIA_BUTTON); intent.putExtra(Intent.EXTRA_KEY_EVENT,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>); mContext.sendBroadcast(intent); intent = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Intent(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>.changeAction(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>,KeyEvent.ACTION_UP); intent.setAction(Intent.ACTION_MEDIA_BUTTON); intent.putExtra(Intent.EXTRA_KEY_EVENT,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">event</span>); mContext.sendBroadcast(intent); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>
3: interceptKeyBeforeQueueing 方法内
在参考行
int result;
之后加入如下语句:
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(keyCode <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> KeyEvent<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>KEYCODE_HEADSETHOOK <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*KeyEvent.KEYCODE_VOLUME_DOWN*/</span>){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(down){ <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//this is headsethook down </span> preLastHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> lastHeadsethookDownTime; lastHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> thisHeadsethookDownTime; thisHeadsethookDownTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> event<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getEventTime(); }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{ preLastHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> lastHeadsethookUpTime; lastHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> thisHeadsethookUpTime; thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> event<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getEventTime(); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"thisHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>thisHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",thisHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>thisHeadsethookDownTime); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"lastHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>lastHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",lastHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>lastHeadsethookDownTime); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"preLastHeadsethookUpTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>preLastHeadsethookUpTime<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",preLastHeadsethookDownTime="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>preLastHeadsethookDownTime); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span> thisHeadsethookDownTime) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookDownTime<span class="hljs-attribute" style="box-sizing: border-box;">-lastHeadsethookDownTime</span>)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"new click serial detected"</span>); clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; mHandler<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>postDelayed(<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> Runnable(){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> run() { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"call sendHeadsetBroadcast clickCount="</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span>clickCount); sendHeadsetBroadcast(clickCount); } }, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>); }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"click serial runing"</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>((thisHeadsethookUpTime <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span> preLastHeadsethookUpTime)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"double click detect"</span>); clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>; }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Log</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>d(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">TAG</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"triple click detect"</span>); clickCount <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>; } } } } result <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; result <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&=</span> ~ACTION_PASS_TO_USER; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> result; }</code>