Android蓝牙AVRCP功能的实现作者:MacroLiuAVRCP的按键定义:\sdk\emulator\keymaps\AVRCP.klkey200MEDIA_PLAY_PAUSEWAKEkey201MEDIA_PLAY_PAUSEWAKEkey166MEDIA_STOPWAKEkey163MEDIA_NEXTWAKEkey165MEDIA_PREVIOUSWAKEkey168MEDIA_REWINDWAKEkey208MEDIA_FAST_FORWARDWAKEBCM(broadcom)宏定义需要打开:BOARD_HAVE_BLUETOOTH_BCM:=trueBT音频控制的代码external\bluetooth\bluez\audio\control.c(1)按键的MAPstaticstruct{constchar*name;uint8_tavrcp;uint16_tuinput;}key_map[]={{"PLAY",PLAY_OP,KEY_PLAYCD},{"STOP",STOP_OP,KEY_STOPCD},{"PAUSE",PAUSE_OP,KEY_PAUSECD},{"FORWARD",FORWARD_OP,KEY_NEXTSONG},{"BACKWARD",BACKWARD_OP,KEY_PREVIOUSSONG},{"REWIND",REWIND_OP,KEY_REWIND},{"FASTFORWARD",FAST_FORWARD_OP,KEY_FASTFORWARD},{NULL}};(2)按键处理staticvoidhandle_panel_passthrough(structcontrol*control,{…for(i=0;key_map[i].name!=NULL;i++){uint8_tkey_quirks;if((operands[0]&0x7F)!=key_map[i].avrcp)continue;DBG("AVRCP:%s%s",key_map[i].name,status);key_quirks=control->key_quirks[key_map[i].avrcp];if(key_quirks&QUIRK_NO_RELEASE){if(!pressed){DBG("AVRCP:Ignoringrelease");break;}DBG("AVRCP:treatingkeypressaspress+release");send_key(control->uinput,key_map[i].uinput,1);send_key(control->uinput,key_map[i].uinput,0);break;}send_key(control->uinput,key_map[i].uinput,pressed);break;}…}HCIDUMP数据分析以Sony耳机DRC-BT15为例#adbshell#hcidump–X左键:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:30110e00487c4c000...H|L.
HCIEvent:MaxSlotsChange(0x1b)plen30000:0c0005...>HCIEvent:ModeChange(0x14)plen60000:000c00000000......>HCIEvent:CommandStatus(0x0f)plen40000:0c010408....>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:40110e00487ccc00@...H|?HCIEvent:NumberofCompletedPackets(0x13)plen50000:010c000200.....播放/暂停:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:50110e00487c4b00P...H|K.ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:60110e00487ccb00`...H|?HCIEvent:NumberofCompletedPackets(0x13)plen50000:010c000200.....右键:>ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:70110e00487c4600p...H|F.ACLdata:handle12flags0x02dlen12L2CAP(d):cid0x0042len8[psm0]0000:80110e00487cc600....H|?HCIEvent:NumberofCompletedPackets(0x13)plen50000:010c000200.....>HCIEvent:MaxSlotsChange(0x1b)plen30000:0c0001...>HCIEvent:ModeChange(0x14)plen60000:000c0002c800....?然后将control.c的日志打印出来:按一次”“播放/暂停键”:D/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=46对应PAUSE_OPD/ACRVP(237):key_quirks=0,pressed=1按键按下D/ACRVP(237):control->uinput=fffffffe,send_key=201对应MEDIA_PLAY_PAUSED/ACRVP(237):---handle_panel_passthrough----D/ACRVP(237):operands[0]=c6(=0x46|0x80表示按键释放了)D/ACRVP(237):key_quirks=0,pressed=0按键释放D/ACRVP(237):control->uinput=fffffffe,send_key=201对应MEDIA_PLAY_PAUSE再按一次”“播放/暂停键”:D/ACRVP(237):---handle_panel_passthrough----D/A...