android avrcp处理流程,(VR虚拟现实)Android 蓝牙AVRCP功能的实现.doc

本文详细介绍了Android系统中蓝牙AVRCP功能的具体实现过程,包括按键映射、事件处理流程及日志分析等内容。通过解决实际遇到的问题,展示了如何确保蓝牙音频控制功能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

253b171540df25e1b84436cbe50dfc72.gif(VR虚拟现实)Android 蓝牙AVRCP功能的实现.doc

Android 蓝牙AVRCP功能的实现作者Macro LiuAVRCP的按键定义sdkemulatorkeymapsAVRCP.klkey 200 MEDIA_PLAY_PAUSE WAKEkey 201 MEDIA_PLAY_PAUSE WAKEkey 166 MEDIA_STOP WAKEkey 163 MEDIA_NEXT WAKEkey 165 MEDIA_PREVIOUS WAKEkey 168 MEDIA_REWIND WAKEkey 208 MEDIA_FAST_FORWARD WAKEBCMbroadcom宏定义需要打开BOARD_HAVE_BLUETOOTH_BCM trueBT音频控制的代码externalbluetoothbluezaudiocontrol.c1 按键的MAPstatic struct const char *name;uint8_t avrcp;uint16_t u; 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 , FAST FORWARD,FAST_FORWARD_OP,KEY_FASTFORWARD , NULL ;2 按键处理static void handle_panel_passthroughstruct control *control, for i 0; key_mapi.name NULL; i uint8_t key_quirks;if operands0 DBGAVRCP s s, key_mapi.name, status;key_quirks control-key_quirkskey_mapi.avrcp;if key_quirks break;DBGAVRCP treating key press as press release;send_keycontrol-u, key_mapi.u, 1;send_keycontrol-u, key_mapi.u, 0;break;send_keycontrol-u, key_mapi.u, pressed;break;HCIDUMP数据分析以Sony耳机DRC-BT15为例adb shellhcidump X左键 ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 30 11 0e 00 48 7c 4c 00 0.H|L. HCI Command Exit Sniff Mode 0 x02|0 x0004 plen 2 0000 0c 00 ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 32 11 0e 09 48 7c 4c 00 K.2.H|L. HCI Event Max Slots Change 0 x1b plen 3 0000 0c 00 05 . HCI Event Mode Change 0 x14 plen 6 0000 00 0c 00 00 00 00 HCI Event Command Status 0 x0f plen 4 0000 0c 01 04 08 ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 40 11 0e 00 48 7c cc 00 .H| ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 42 11 0e 09 48 7c cc 00 K.B.H| HCI Event Number of Completed Packets 0 x13 plen 5 0000 01 0c 00 02 00 .播放/暂停 ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 50 11 0e 00 48 7c 4b 00 P.H|K. ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 52 11 0e 09 48 7c 4b 00 K.R.H|K. ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 60 11 0e 00 48 7c cb 00 .H| ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 62 11 0e 09 48 7c cb 00 K.b.H| HCI Event Number of Completed Packets 0 x13 plen 5 0000 01 0c 00 02 00 .右键 ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 70 11 0e 00 48 7c 46 00 p.H|F. ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 72 11 0e 09 48 7c 46 00 K.r.H|F. ACL data handle 12 flags 0 x02 dlen 12 L2CAPd cid 0 x0042 len 8 psm 0 0000 80 11 0e 00 48 7c c6 00 H| ACL data handle 12 flags 0 x00 dlen 12 0000 08 00 4b 00 82 11 0e 09 48 7c c6 00 K.H| HCI Event Number of Completed Packets 0 x13 plen 5 0000 01 0c 00 02 00 . HCI Event Max Slots Change 0 x1b plen 3 0000 0c 00 01 . HCI Event Mode Change 0 x14 plen 6 0000 00 0c 00 02 c8 00 然后将control.c的日志打印出来按一次”“播放/暂停键”D/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 46 对应PAUSE_OPD/ACRVP 237 key_quirks 0, pressed 1按键按下D/ACRVP 237 control-u fffffffe,send_key 201对应MEDIA_PLAY_PAUSED/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 c6 0 x46 0 x80 表示按键释放了D/ACRVP 237 key_quirks 0, pressed 0按键释放D/ACRVP 237 control-u fffffffe,send_key 201 对应MEDIA_PLAY_PAUSE再按一次”“播放/暂停键”D/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 44 对应PLAY_OPD/ACRVP 237 key_quirks 0, pressed 1 按键按下D/ACRVP 237 control-u fffffffe,send_key 200 对应MEDIA_PLAY_PAUSED/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 c4D/ACRVP 237 key_quirks 0, pressed 0 按键释放D/ACRVP 237 control-u fffffffe,send_key 200 对应MEDIA_PLAY_PAUSEnext keyD/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 4b对应FORWARD_OPD/ACRVP 237 key_quirks 0, pressed 1D/ACRVP 237 control-u fffffffe,send_key 163 对应MEDIA_NEXTD/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 cbD/ACRVP 237 key_quirks 0, pressed 0D/ACRVP 237 control-u fffffffe,send_key 163prev keyD/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 4c 对应BACKWARD_OPD/ACRVP 237 key_quirks 0, pressed 1D/ACRVP 237 control-u fffffffe,send_key 165 对应D/ACRVP 237 - handle_panel_passthrough D/ACRVP 237 operands0 ccD/ACRVP 237 key_quirks 0, pressed 0D/ACRVP 237 control-u fffffffe,send_key 165 MEDIA_PREVIOUS从上面可以看到bluetooth的协议栈blueZ是没有问题的将 frameworksbaselibsuiEventHub.cpp的LOG打开,只能看到了control.c的日志,EventHub的getEvent完全不响应观察所有log日志发现,openDevice里也没有装载AVRCP.kl初步判断event有问题event分析 adb shell cd /proc/bus/ cat devicescat devices cat devicescat devicesI Bus0019 Vendor0001 Product0001 Version0001 参考s3c-keypad.cN Names3c-keypad _dev-name DEVICE_NAME;P Physs3c-keypad/0 _dev-phys s3c-keypad/0;S Sysfs/devices/virtual//0 virtual的U UniqH Handlersevent0B EV3B KEY4000400 0I Bus0019 Vendor0001 Product0001 Version0100参考vpad_buttons.cN Names3c-eintkey -name pdev-name, gpio_keys_device_driver.name s3c-eintkey,P Physgpio-keys/0 -phys gpio-keys/0S Sysfs/devices/plat/s3c-eintkey//1 为什么这里是plat目录U UniqH Handlersevent1B EV3B KEY100000 0 0 0I Bus0018 Vendor0000 Product0000 Version0000 参考amri_ts.cN Nameamri_ts amri_ts_driver.name amri_tsP Phys 没有定义S Sysfs/devices/plat/s3c2440-i2c.0/i2c-0/0-0033//2 为什么这里是plat目录U UniqH Handlersevent2B EVbB KEY400 0 0 0 0 0 40000800 40 0 0 10000B ABS2650000 0I Bus0000 Vendor0000 Product0000 Version0000N Nameecompass_dataP PhysS Sysfs/devices/virtual//3U UniqH Handlersevent3B EV9B ABS307bf从上面可以看到,完全没有AVRCP的event。解决办法Kernel make menuconfigCONFIG__U解决后的状况 adb shell cd /proc/bus/ cat devices显示增加了一个eventI Bus0005 Vendor0000 Product0000 Version0000N NameAVRCPP PhysS Sysfs/devices/virtual//4U UniqH Handlersevent4B EV100007B KEY10300 168 0 0 0 0 0B REL0看openDevice的信息D/EventHub 84 EventHubreadNotify nfd 87D/EventHub 84 Opening device /dev//event4D/EventHub 84 Getting keys.D/EventHub 84 Getting absolute controllers.D/EventHub 84 keylayoutFilename /system/usr/keylayout/AVRCP.kl I/EventHub 84 New keyboard device-id0 x10003 devnameAVRCP propNamehw.keyboards.65539.devname keylayout/system/usr/keylayout/AVRCP.klI/EventHub 84 New device path/dev//event4 nameAVRCP id0 x10003 of 0 x4 index4 fd196 classes0 x1D/EventHub 84 Adding device /dev//event4 0 x361800 at 4, id 3, classes 0 x1D/EventHub 84 Reporting device opened id0 x10003, name/dev//event4按键时也可以看到EventHub的信息了Log如下D/ACRVP 236 - handle_panel_passthrough D/ACRVP 236 operands0 46D/ACRVP 236 key_quirks 0, pressed 1D/ACRVP 236 control-u 14,send_key 201 control.c发出201号键,按键按下了D/EventHub 84 /dev//event4 got t0937, t1582930, type1, code201, v1 表示从event4得到201号键 MEDIA_PLAY_PAUSED/EventHub 84 iev.code201 keyCode85 flags0 x00000001 err0D/EventHub 84 /dev//event4 got t0937, t1600241, type0, code0, v0D/AudioHardware 61 AudioStreamOutALSAsetParameters routing0D/ACRVP 236 - handle_panel_passthrough D/ACRVP 236 operands0 c6D/ACRVP 236 key_quirks 0, pressed 0D/ACRVP 236 control-u 14,send_key c9D/EventHub 84 /dev//event4 got t0937, t1664391, type1, code201, v0 control.c发出201号键,按键释放了D/EventHub 84 iev.code201 keyCode85 flags0 x00000001 err0D/EventHub 84 /dev//event4 got t0937, t1664406, type0, code0, v0D/A2DP 61 a2dp_stopD/A2DP 61 bluetooth_stopE/BluetoothEventLoop.cpp 84 event_filter Received signal org.bluez.AudioSinkStopped from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1CE/BluetoothEventLoop.cpp 84 event_filter Received signal org.bluez.AudioSinkPropertyChanged from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1CE/BluetoothEventLoop.cpp 84 event_filter Received signal org.bluez.AudioSinkPropertyChanged from /org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1CV/BluetoothEventRedirector 244 Received android.bluetooth.a2dp.action.SINK_STATE_CHANGEDD/CachedBluetoothDevice 244 onProfileStateChanged profile A2DP newProfileState 2D/BluetoothA2dpService 84 A2DP state device 001DBAA5D81C State4-2D/A2DP 61 Received BT_RESPONSE - BT_STOP_STREAMD/dalvikvm 285 GC_EXPLICIT freed 87K, 56 free 2640K/5895K, external 1625K/2137K, paused 75msMacro Liu2011-08-01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值