平臺:CSR8670
SDK:ADK4.1
場景:CSR8670作爲HF,當AG連接上後,獲取來電的號碼
結論:如果不關注流程的,很簡單,直接通過下面的設置並且Write Device就可以了。
不斷變化的需求:
我的原始需求並不是這樣,而是要把這塊業務能力抽象出來,提供產品需求上的支撐。一個場景就是來電之後,APP通過內部協議把電話號碼發送給設備,設備拿到號碼之後
可以選擇播放,也可以有其他的動作
流程:
爲了知道上圖中的那個設置到底幹了什麼,在網上沒啥資料可搜索的情況下,第一時間看官方的HFP相關的文檔,來電的時候是HFP profile的相關知識,這是基礎。
上圖是官方文檔,來電的時候猜測可能AG會嘗試建立語音連接,所以重點查看SCO和ALC的incoming connection過程,最後在這個流程下找到對應的開發實現,
流程圖如下:
這裏面查看一下應用層收到的HFP_SLC_CONNECT_CFM消息:
main.c中收到這個消息的代碼調用:
case HFP_SLC_CONNECT_CFM:
sinkHandleSlcConnectCfm(conncfm);
sinkHandleSlcConnectCfm中對SLC做了setup操作,通過調用slcConnectionSetup,這裏面就調用了HfpCallerIdEnableRequest方法,打開這個方法的註釋,
大家會發現這個是發給AG的一個請求,請求對方告知caller id,也就是來電號碼了。如果AG允許了,系統會推送一個消息給應用層,消息id爲HFP_CALLER_ID_IND,
只要在這個case裏面拿到消息,就可以獲取到來電號碼了,當然也可以利用ADK提供的方法來播放號碼對應的語音了。