1. 程式人生 > >android bt藍芽耳機AVRCP按鍵分析

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