PBAP同步電話簿的安卓實作

藍牙電話中同步電話簿基本包含兩個流程:同步聯系人 + 同步通話記錄,那本期我們就簡單聊聊安卓系統中藍牙電話(PCE)的電話簿是如何同步的,
本篇文章參考的安卓原始碼版本:Android 9(P版本),熟悉安卓原始碼架構的同學應該都清楚藍牙這一套服務在其中所處的層級關系,由于現有的安卓API介面BluetoothPbapClient還沒有集成相應的同步電話簿資料介面,即使是將要發布的最新Android 11版本中藍牙API的同步電話簿的介面還是沒有集成,但是藍牙服務層com.android.bluetooth中相關的資料同步決議已實作,因此需要我們自己添加API打通framework到service的連接,這一部分很容易實作就不展開說明,
電話簿同步離不開PBAP協議的連接,文章《藍牙電話之PBAP協議的連接》已經對安卓系統中的連接流程做出總結,還不清楚的同學可以先行查看,連接流程主要在藍牙服務層和bluedroid協議堆疊間創建 socket 進行通信,那本篇的資料同步肯定也離不了這個socket,
打通framework層和藍牙服務層之間的聯系后,同步指令首先發送到PbapClientService,我們就以此為起點展開分析,
當前安卓原始碼中集成了聯系人和通話記錄一起同步的流程,且同步的物件數量都是全部同步過來(除了同步聯系人時剔除掉了本機號碼資訊),聯系人資訊全部取過來還好理解,但是通話記錄超多的手機(見過幾萬條通話記錄的手機…)沒有必要全部同步過來(很費時),因此各位還可以根據自己的需要重新適配藍牙服務層中關于PBAP同步的邏輯,比如只同步最新N條通話記錄等等操作,
先讓我們來簡單看下安卓系統中同步電話簿的時序圖:

PBAP的PCE在安卓系統中同步資料的主要流程如上所述,這里就不貼代碼了(我也不喜歡枯燥的講解代碼),需要跟蹤代碼流程的同學照著上面的時序圖一步步分析就行了,
時序圖中可以看出同步的主要流程在PBAP連接、斷開、同步資料的子執行緒 PbapClientConnectionHandler 中完成的,通過 BluetoothPbapRequestPullPhoneBook 下發命令并對回復的資料進行決議,
資料決議主要通過com.android.vcard包中提供的相關方法完成,感興趣的同學建議重點分析VCardEntry這個類,
資料最侄訓被存盤于安卓系統自帶的資料庫中,對資料庫的操作想必大家都有一定的基礎,我就不做介紹了,
聯系人資料庫:/data/data/com.android.providers.contacts/databases/contacts2.db
通話記錄資料庫:/data/data/com.android.providers.contacts/databases/calllog.db
一點小建議:
藍牙電話等應用通過framework新增介面成功下發同步指令后,還需要知道同步情況如何?同步失敗增加錯誤流程處理;同步成功從系統資料庫中提取資料處理或顯示,
因此藍牙服務層在同步結束后需將同步結果告知應用,安卓系統中最簡單的方法莫過于廣播了,
感興趣的小伙伴歡迎私信留言一起討論,共同學習,一起進步!
更多互聯互通技術,歡迎關注微信公眾號:Connectivity

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/68859.html
標籤:其他
上一篇:前端ios和安卓的兼容性問題
