Android 通話與藍(lán)牙的交互

一递沪、telecom進(jìn)程和bluetooth進(jìn)程的交互方方式

1. telecom進(jìn)程主動(dòng)控制藍(lán)牙的操作是通過(guò)跨進(jìn)程調(diào)用bluetooth進(jìn)程中HeadService的接口家破。

2. 藍(lán)牙狀態(tài)變更是通過(guò)廣播通知telecom進(jìn)程那婉。

如下圖:

進(jìn)程交互

具體細(xì)節(jié)如下:

進(jìn)程交互細(xì)節(jié)

telecom進(jìn)程在創(chuàng)建時(shí),TelecomService會(huì)創(chuàng)建BluetoothDeviceManager類來(lái)負(fù)責(zé)所有和bluetooth進(jìn)程有關(guān)的操作:BluetoothAdapter的代理類BluetoothAdapterProxy創(chuàng)建BluetoothHeadset铡恕,負(fù)責(zé)跨進(jìn)程調(diào)用HeadsetService中的接口睦尽,然后把它返回給一個(gè)代理類BluetoothHeadsetProxy宇攻,所有和藍(lán)牙的有關(guān)操作都直接通過(guò)這個(gè)代理類處理尖淘。同時(shí),TelecomService會(huì)創(chuàng)建一個(gè)專門(mén)用來(lái)接收藍(lán)牙廣播的類BluetoothStateReceiver著觉,收到廣播后通過(guò)BluetoothRouteManager來(lái)通知管理通話audio route的CallAudioRouteManager村生,然后通知界面更新。用戶在通話界面切換聲音模式時(shí)也是通過(guò)CallAudioRouteManager通知BluetoothRouteManager然后調(diào)用用BluetoothHeadset的接口來(lái)處理饼丘。BluetoothRouteManager是通話audio route和藍(lán)牙相關(guān)信息的中轉(zhuǎn)站趁桃。

二、Telecom接收的藍(lán)牙廣播

BluetoothHeadset.ACTIVE_ACTIVE_DEVICE_CHANGED

這個(gè)廣播是在藍(lán)牙打開(kāi)肄鸽,有藍(lán)牙設(shè)備連接或者斷開(kāi)時(shí)發(fā)送卫病。收到這個(gè)廣播后,telecom會(huì)根據(jù)當(dāng)前device的連接狀態(tài)來(lái)判斷是否要切換為bluetooth route典徘。如下圖:

active device changed

BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED

這個(gè)廣播是藍(lán)牙開(kāi)關(guān)打開(kāi)或關(guān)閉時(shí)發(fā)送蟀苛。收到這個(gè)廣播后telecom會(huì)更新當(dāng)前支持的audio routes。如圖:

connection state changed

BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED

這個(gè)廣播是HFP連接或斷開(kāi)時(shí)發(fā)送逮诲。如圖:

audio state changed

這個(gè)廣播不僅會(huì)讓telecom切換當(dāng)前audio route也是唯一一個(gè)會(huì)引起 BluetoothRouteManager切換bluetooth StateMachine切換狀態(tài)的廣播帜平。

三、BluetoothRouteManager StateMachine

先介紹一下StateMachine里面頻繁用到的一個(gè)專有名詞:HFP梅鹦。

HFP(Hands-free Profile):讓藍(lán)牙設(shè)備可以控制電話裆甩,如接聽(tīng)、掛斷帘瞭、拒接淑掌、語(yǔ)音音撥號(hào)等,拒接蝶念、語(yǔ)音撥號(hào)要視藍(lán)牙耳機(jī)及電話是否支持抛腕,是讓藍(lán)牙耳機(jī)進(jìn)入高保真通話的一種可設(shè)置模式。

再來(lái)看SM的構(gòu)成:

bluetooth statemachine

從圖中可以看出:

1. CONNECT_HFP只能切換到AudioConnectingState媒殉,要等到HFP_IS_ON才會(huì)把狀態(tài)切換成AudioConnectedState担敌。DISCONNECT_HFP一定會(huì)把狀態(tài)切換成AudioOffState,但HFP_LOST不一定廷蓉。CONNECT_HFP DISCONNECT_HFP是通話主動(dòng)發(fā)起的藍(lán)牙狀態(tài)連接或斷開(kāi)全封,而HFP_IS_ON HFP_LOST是藍(lán)牙上報(bào)的設(shè)備audio連接或斷開(kāi)。

2. 不同的藍(lán)牙設(shè)備分別有自己的AudioConnectingState和AudioConnectedState狀態(tài),但AudioOffState狀態(tài)卻不分設(shè)備桃犬。這就會(huì)引起一個(gè)問(wèn)題:

例如:當(dāng)一臺(tái)手機(jī)連接兩個(gè)藍(lán)牙耳機(jī)A和B,目前通話正在使用A刹悴,用戶在藍(lán)牙設(shè)置界面選擇切換成B。此時(shí),藍(lán)牙會(huì)先斷開(kāi)A的audio連接然后再建立B的audio連接攒暇。于是通話會(huì)先收到A的HFP_LOST然后再收到B的HFP_IS_ON土匀,這里就會(huì)有一個(gè)time issue:當(dāng)AudioConnectedState收到HFP_LOST時(shí)B的audio沒(méi)有連接上,但進(jìn)入到AudioOffState前B的audio連接上了,此時(shí)在AudioOffState的enter中會(huì)斷開(kāi)B的連接,導(dǎo)致聲道切換成B失敗形用,而從聽(tīng)筒出聲就轧。

原因:A和B沒(méi)有自己的AudioOffState,導(dǎo)致?tīng)顟B(tài)混亂证杭。

解決方法:給接收HFP_LOST斷開(kāi)的設(shè)備建立它自己的AudioOffState。

issue


四妒御、通話中用戶主動(dòng)切換藍(lán)牙聲道

耳機(jī)切換至藍(lán)牙

當(dāng)用戶主動(dòng)切換到藍(lán)牙聲道時(shí)解愤,CallAudioRouteStateMachine在切換到BluetoothRoute之前會(huì)先打開(kāi)藍(lán)牙,同時(shí)發(fā)送CONNECT_HFP消息,從AudioOffState切換到AudioConnectingState乎莉,這時(shí)會(huì)觸發(fā)一個(gè)timeout送讲,圖中沒(méi)有表示,具體可以去看代碼梦鉴。當(dāng)藍(lán)牙audio連接時(shí),會(huì)發(fā)送BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED的廣播李茫,收到這個(gè)廣播后會(huì)發(fā)送HFP_IS_ON的message給SM揭保,然后從AudioConnectingState切換到AudioConnectedState肥橙。進(jìn)入AudioConnectedState之后會(huì)通知CallAudioRouteStateMachine切換到BluetoothRoute。如下圖:

耳機(jī)切換至藍(lán)牙

藍(lán)牙切換至耳機(jī)

進(jìn)入非BluetoothRoute時(shí)會(huì)把藍(lán)牙audio斷開(kāi)秸侣。如下圖:

藍(lán)牙切換至耳機(jī)

五存筏、藍(lán)牙主動(dòng)上報(bào)狀態(tài)更新

通話中,連接藍(lán)牙設(shè)備

如上圖:收到Bluetooth.ACTION_CONNECTION_STATE_CHANGED CONNECTED時(shí)更新可用的audioroutes,收到Bluetooth.ACTION_AUDIO_STATE_CHANGED CONNECTED時(shí)更新statemachine到AudioConnectedState和ActiveBluetoothRoute味榛。

通話中連接藍(lán)牙設(shè)備

非通話中椭坚,連接藍(lán)牙設(shè)備

非通話中,連接藍(lán)牙設(shè)備

如上圖:收到Bluetooth.ACTION_CONNECTION_STATE_CHANGED CONNECTED時(shí)更新可用的audioroutes搏色,收到Bluetooth.ACTION_DEVICE_STATE_CHANGED CONNECTED時(shí)更新statemachine到QuiescentBluetoothRoute善茎。

當(dāng)撥號(hào)或來(lái)電時(shí)會(huì)請(qǐng)求藍(lán)牙audio連接,藍(lán)牙audio連接后再切換到active或ringing bluetooth route频轿。

藍(lán)牙設(shè)備連接時(shí)垂涯,插入耳機(jī)

如下圖,此時(shí)通話會(huì)默認(rèn)切換到耳機(jī)通道

藍(lán)牙設(shè)備連接時(shí),插入耳機(jī)


原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載航邢,但請(qǐng)注明出處耕赘,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膳殷,一起剝皮案震驚了整個(gè)濱河市操骡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赚窃,老刑警劉巖册招,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勒极,居然都是意外死亡是掰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)河质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冀惭,“玉大人震叙,你說(shuō)我怎么就攤上這事∩⑿荩” “怎么了媒楼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)戚丸。 經(jīng)常有香客問(wèn)我划址,道長(zhǎng),這世上最難降的妖魔是什么限府? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任夺颤,我火速辦了婚禮,結(jié)果婚禮上胁勺,老公的妹妹穿的比我還像新娘世澜。我一直安慰自己,他們只是感情好署穗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布寥裂。 她就那樣靜靜地躺著,像睡著了一般案疲。 火紅的嫁衣襯著肌膚如雪封恰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天褐啡,我揣著相機(jī)與錄音诺舔,去河邊找鬼。 笑死备畦,一個(gè)胖子當(dāng)著我的面吹牛低飒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萍恕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逸嘀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了允粤?” 一聲冷哼從身側(cè)響起崭倘,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎类垫,沒(méi)想到半個(gè)月后司光,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悉患,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年残家,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片售躁。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坞淮,死狀恐怖茴晋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情回窘,我是刑警寧澤诺擅,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站啡直,受9級(jí)特大地震影響烁涌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酒觅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一撮执、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舷丹,春花似錦抒钱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)症杏。三九已至装获,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厉颤,已是汗流浹背穴豫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逼友,地道東北人精肃。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帜乞,于是被迫代替她去往敵國(guó)和親司抱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.簡(jiǎn)介 通過(guò)藍(lán)牙API黎烈,可以實(shí)現(xiàn)以下內(nèi)容: 掃描其他藍(lán)牙設(shè)備 查詢配對(duì)藍(lán)牙設(shè)備的本地藍(lán)牙適配器 創(chuàng)建RFCOMM...
    justCode_閱讀 4,808評(píng)論 0 3
  • 藍(lán)牙 注:本文翻譯自https://developer.android.com/guide/topics/conn...
    RxCode閱讀 8,626評(píng)論 11 99
  • 基礎(chǔ)知識(shí) 藍(lán)牙操作主要有四項(xiàng)任務(wù):設(shè)置藍(lán)牙习柠、查找局部區(qū)域內(nèi)的配對(duì)設(shè)備或可用設(shè)備、連接設(shè)備照棋,以及在設(shè)備間傳輸數(shù)據(jù)资溃。 ...
    未子涵閱讀 18,349評(píng)論 3 7
  • 前言 最近在做Android藍(lán)牙這部分內(nèi)容,所以查閱了很多相關(guān)資料烈炭,在此總結(jié)一下溶锭。 基本概念 Bluetooth是...
    貓疏閱讀 14,495評(píng)論 7 113
  • 她睜開(kāi)眼,迷迷糊糊地起床摸黑去倒了杯水喝符隙。 如今已是她離家的第十二個(gè)年頭趴捅,剛?cè)氪旱姹校炻詻觯欢门路匀淮蚱鹆?..
    陸不換閱讀 160評(píng)論 0 0