android bt藍芽耳機AVRCP按鍵分析
目前大多數音訊視訊裝置採用紅外遙控器,由於距離、角度、障礙物等的影響,紅外遙控器的應用受到了很大限制。藍芽無線通訊技術可以實現傳統紅外遙控全部應用功能,而且客服了紅外遙控器的侷限性。藍芽音訊視訊遙控應用框架(Audio Video Remote Control Profile,AVRCP)就是實現無線遙控功能的規範。
藍芽耳機按鍵的處理在android層主要就是對BT的AVRCP profile的處理。下面我們來具體看下。
上層對接收到的AVRCP命令的處理有兩部分。
1、對metadata, play status and event notification的處理。(avrcp.java)
2、對播放、暫停、停止、上一首、下一首的按鍵處理(快進和快退不在這裡處理,是第一種情況)。使用uinput模擬輸入裝置轉化為input event。
現在我們就來分別分析一下上述的兩種處理。
一、avrcp音訊屬性的處理
AVRCP主要負責以下的功能:
1、 接受來自藍芽耳機的請求,並返回響應;
2、 當用戶直接用手機操作音樂時,將狀態更新到藍芽耳機;
3、 將手機音量的改變通知藍芽耳機,將藍芽耳機音量的改變通知手機audio;
上面的功能主要是通過回撥函式、Native函式和AvrcpMessageHandler類實現的。回撥函式負責將來自藍芽耳機的訊息通知給手機,Native函式返回響應給藍芽耳機。
主要包含以下回調方法:
方法 |
介紹 |
getRcFeatrues |
Avrcp是否支援absolute volume |
getPlayStatus |
獲取播放狀態 |
getElementAttr |
獲取音樂屬性資訊 |
registerNotification |
獲取register notification響應 |
volumeChangeCallback |
藍芽耳機音量改變 |
handlePassthroughCmd |
處理passthrough命令 |
主要包含以下native方法:
方法 |
介紹 |
classInitNative |
初始化回撥方法 |
initNative |
獲取avrcp介面例項,並呼叫init初始化 |
cleanupNative |
銷燬avrcp介面例項 |
getPlayStatusRspNative |
播放狀態的響應 |
getElementAttrRspNative |
獲取音樂屬性資訊的響應 |
registerNotificationRspPlayStatusNative |
響應register notification |
registerNotificationRspTrackChangeNative |
響應register notification |
registerNotificationRspPlayPosNative |
響應register notification |
setVolumeNative |
設定藍芽耳機的音量 |
二、藍芽耳機按鍵在android側的對映處理
AVRCP的按鍵定義:
程式碼路徑在frameworks/base/data/keyboards/AVRCP.kl
key 200 MEDIA_PLAY_PAUSE WAKE
key 201 MEDIA_PLAY_PAUSE WAKE
key 166 MEDIA_STOP WAKE
key 163 MEDIA_NEXT WAKE
key 165 MEDIA_PREVIOUS WAKE
key 168 MEDIA_REWIND WAKE
key 208 MEDIA_FAST_FORWARD WAKE
前面的key 值是在藍芽耳機中定義的key code ,後面的MEDIA_xx是在android中定義的key code。
在google remote中,android接收端接收socket發來的IR CODE,然後將IRCODE模擬出來發給系統處理,這就是google remote接收端的原理。這裡使用的是使用uinput模擬輸入裝置。通過 send_key函式,使用uinput橋接,傳送input event。uinput原理是利用核心現有的uinput驅動,通過核心驅動uinput來發送input event。
avrcp按鍵對映成inputevent 處理過程:
Thread: InputDeviceReader是整個Input過程的控制中心(在Android4.x中,這個thread在InputManager.cpp中)。這個thread通過EventHub::getEvent()來讀Linux的 /dev/input目錄下的Input Devices,從而得到硬體的key input。基於一個與每個Input Device關聯的key layout map,key input會被map成Android能夠識別的Key Code,比如一個AVRCP Input Device的key input值200就會被map成MEDIA_PLAY。
需要注意的是,在EventHub::getEvnet()讀Input Devices之前,需要判斷Devices是否已經被開啟。如果沒有就需要去呼叫EventHub::openPlatformInput()去掃描 /dev/input/下有哪些裝置,然後開啟這些裝置並載入它們各自的keylayout map(/frameworks/base/data/keyboards/ 中的*.kl檔案就是用於定義key layout map的,其中的AVRCP.kl就定義了Bluetooth AVRCP Input Device的key layout map。在Android Device的root fs中,這些.kl檔案會被放在/system/usr/keylayout/目錄)。這些被開啟的裝置的file descriptor和device_t指標會分別儲存在mFDs和mDevices中。InputDeviceReaderThread得到Key Code之後,會交給Java層的程式碼來處理。最終由PhoneWindowManager.java中的interceptKeyBeforeQueueing()建立一個訊息 MSG_DISPATCH_MEDIA_KEY_WITH_WAKE_LOCK,經過訊息的轉發和處理最後在dispatchMediaKeyEven函式裡建立併發送ACTION_MEDIA_BUTTON intent廣播出去。
傳送ACTION_MEDIA_BUTTON的程式碼路徑:
frameworks/base/media/java/android/media/MediaFocusControl.java。
接收ACTION_MEDIA_BUTTON的程式碼路徑在:
packages/apps/Music/src/com/android/music/MediaButtonIntentReceiver.java
在檔案MediaButtonIntentReceiver裡會把按鍵轉化為MediaPlaybackService的command,然後啟動MediaPlaybackService對這些command進行處理,包括音樂進行暫停、播放、停止等操作。
MediaPlaybackService的程式碼路徑:
packages/apps/Music/src/com/android/music/MediaPlaybackService.java,
在 onStartCommand裡對音樂播放器進行暫停、播放、停止等操作。
三、藍芽耳機按鍵的hci log分析
簡單說一下發送命令的處理過程,主要分為兩步,按鍵按下發送一個Pass though命令,按鍵彈起的時候,會再次傳送一個Pass though命令,第一個命令的State_flag為Button Pushed,第二個命令的state_flag為Button Released。每個命令都需要對方的迴應,如果接受,則會迴應Accepted,否則返回Rejected。下面就以藍芽耳機的播放鍵為例子來說明一下。
播放按鍵的BT log如下:
如上圖,1463幀的Role為CT,代表為藍芽耳機,向手機發送play命令,手機迴應accepted,然後,CT傳送按鍵彈起的命令,收到ACCEPTED,整個播放的log就結束了。上面的NOTIFY,是藍芽耳機發送的同步命令,手機會發送CHANGED進行響應,如果在100ms內,不能進行響應,則會先發送INTERIM進行告知,再發送CHANGED。
相關推薦
android bt藍芽耳機AVRCP按鍵分析
目前大多數音訊視訊裝置採用紅外遙控器,由於距離、角度、障礙物等的影響,紅外遙控器的應用受到了很大限制。藍芽無線通訊技術可以實現傳統紅外遙控全部應用功能,而且客服了紅外遙控器的侷限性。藍芽音訊視訊遙控應用框架(Audio Video Remote Contro
Android監聽藍芽耳機的按鍵事件 藍芽無法響應KeyEvent監聽不到
需求:藍芽耳機的按鍵事件,暫停/播放 音訊/視訊 ,無法響應藍芽KeyEvent的事件 此問題是由於中的藍芽KeyEvent監聽不到導致的,可以通過以下方法監聽藍芽按鍵事件 private MediaSession mSession; &
Android如何監聽藍芽耳機的按鍵事件
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Android 接收藍芽耳機按鍵操作
http://blog.chinaunix.net/uid-27875-id-3287837.html 3 import android.bluetooth.BluetoothAdapter;
Android APP通過藍芽耳機錄音可行性分析
1 藍芽的兩種型別 部署最為普遍的兩種規格為藍芽基礎率/增強資料率 (BR/EDR)(採用版本為 2.0/2.1)和低耗能 (LE) 藍芽(採用版本為 4.0/4.1/4.2)。 存在哪些差異? 藍芽 BR/EDR—可建立相對較短距離的持續無線連線,因此非
藍芽耳機按鍵在Android側的處理流程
目前大多數音訊視訊裝置採用紅外遙控器,由於距離、角度、障礙物等的影響,紅外遙控器的應用受到了很大限制。藍芽無線通訊技術可以實現傳統紅外遙控全部應用功能,而且客服了紅外遙控器的侷限性。藍芽音訊視訊遙控應用框架(Audio Video Remote Control P
Android 藍芽抓包和分析
轉自:https://blog.csdn.net/wangbf_java/article/details/81269149 藍芽通訊其實和http通訊有點類似,http通過介面互動抓取資料包也很方便,但是到了藍芽就沒那麼方便了,本文就是介紹如何實現藍芽資料包的抓取。 怎麼抓包 首先設定在手機
Android開發之通過藍芽耳機實現訊飛語音識別的功能
近階段在開發一款app,實現通過藍芽耳機進行訊飛語音識別,獲取識別結果之後再通過語音合成從藍芽耳機播報出識別結果。上網也查了很多資料,大多是說通過一下兩行程式碼: mAudioManager.setBluetoothScoOn(true);
Android平臺藍芽程式設計之藍芽聊天分析(二)
接著上一篇沒有完成的任務,我們繼續分析這個藍芽聊天程式的實現,本文主要包括以下兩個部分的內容:其一,分析掃描裝置部分DeviceListActivity,其二,分析具體的聊天過程的完整通訊方案,包括埠監聽、連結配對、訊息傳送和接收等,如果有對上一篇文章不太熟悉的,可以返回
Android-經典藍芽(BT)-建立長連線傳輸短訊息和檔案
一.藍芽模組簡介 從藍芽4.0開始包含兩個藍芽晶片模組:傳統/經典藍芽模組(Classic Bluetooth,簡稱BT)和低功耗藍芽(Bluetooth Low Energy,簡稱BLE) 經典藍芽是在之前的藍芽1.0,1.2,2.0+E
Android耳機線控詳解,藍芽耳機按鈕監聽(仿酷狗線控效果)
當耳機的媒體按鍵被單擊後,Android系統會發出一個廣播,該廣播的攜帶者一個Action名為MEDIA_BUTTON的Intent。監聽該廣播便可以獲取手機的耳機媒體按鍵的單擊事件。 在Android中有個AudioManager類,該類會維護MEDIA_BUTTON廣播的分發,所以要實現耳機按鍵監聽需
Android實現主動連線藍芽耳機
原網址:http://www.cnblogs.com/tt2015-sz/p/5616607.html private static final String TAG = "BluetoothA2DPTest"; private BroadcastReceive
Android狀態列顯示藍芽耳機電量
1.HeadsetStateMachine.java static { classInitNative(); VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID = new HashMap&l
Android Bluetooth 藍芽強度Rssi
轉自 https://blog.csdn.net/lhc1105/article/details/54585632 轉自 https://blog.csdn.net/jasonwang18/article/details/73131020 轉自 http://www.cnblogs.co
Microchip美國微芯推出微控制器晶片解決藍芽耳機硬質BUG
Microchip美國微芯推出微控制器晶片解決藍芽耳機硬質BUG。嘿嘿福利來啦,採用搭載索尼LDAC技術的全新Microchip藍芽®音訊SoC打造高清音訊裝置。 如今,Microchip Technology Inc.(美國微芯科技公司)為音訊系統設計人員提供了經驗證的採用索尼LDAC音訊
電子產品開發之藍芽耳機收納盒控制微控制器晶片
今日分享一款電子產品—藍芽耳機收納盒及藍芽耳機收納盒控制微控制器晶片。使用藍芽耳機的各位肯定都是曉得藍芽耳機收納盒的。大部分藍芽耳機都會隨機配備一款與之匹配的充電盒,充電盒能為其提供電力以及收納存放的功能。 藍芽耳機充電很多事使用Micro USB充電,充電口附近會有充電指示燈。拿出耳機
Android學習——藍芽(Bluetooth)
藍芽(Bluetooth) 藍芽(Bluetooth)是一種短距離的無線通訊技術標準。 藍芽協議 藍芽協議分為4層,即核心替代層、電纜替代協議層、電話控制協議層和採納的其他的協議層。這4種最重要的是核心協議層。藍芽協議包括基帶、鏈路管理、邏輯鏈路控制和適應協議四部分。其中鏈路
Android學習——藍芽傳輸
藍芽傳輸 通過藍芽傳輸資料與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的資料讀寫。而藍芽通訊也由客戶端和服務端Socket來完成。藍芽客戶端Socket是BluetoothSocket,藍芽服務端Socket是BluetoothServer
Android學習——藍芽Socket通訊
藍芽Socket通訊 UUID 在藍芽中,每個服務和服務屬性都唯一地由 全域性唯一識別符號 ,Universally Unique Identifier(UUID)來校驗。正如它的名字所暗示的,每一個這樣的識別符號都要在時空上保證唯一。UUID類可表現為短整形(16或32位)和長
Android獲取藍芽地址(非mac地址)
方法: public static String getBlueToothAddress(Context context){ return android.provider.Settings.Secure.getString(context.getContentResol