藍牙電話之PBAP-同步電話簿的幾點注意事項

藍牙電話之PBAP-同步電話簿的幾點注意事項

在這裏插入圖片描述

使用原生安卓同步完電話簿數據後,藍牙服務層會直接將從手機端同步到的數據寫入數據庫,輔以同步狀態的上報,這樣藍牙電話應用就知道何時觸發從數據庫中取出相應的聯繫人和通話記錄等數據。

然而實際運行測試下來也發現了不少問題,所以此篇就是簡單記錄下PBAP同步數據存儲這塊遇到的問題,以供大家參考。

問題1:
/data/data/com.android.providers.contacts/databases/calllog.db
通話記錄表中subscription_id這一列存儲的是一個hashCode值,該值爲Account的hash值,其組成如下圖:
在這裏插入圖片描述

  • name 就是當前同步電話簿數據的遠端藍牙設備地址
  • type 就是當前的pbap_account_type類型值,詳細參數可以參考如下路徑中定義的string值:
    packages\apps\Bluetooth\res\values\strings_pbap_client.xml
    在這裏插入圖片描述

對同一個藍牙設備而言,由於其地址不會改變,且pbap_account_type值固定,所以這個hash值是一定的,也就是CallLog.Calls.PHONE_ACCOUNT_ID(subscription_id)這一列數據對同一藍牙設備是不變的。

問題就在於藍牙電話應用去數據庫中查詢通話記錄時,是不知道pbap_account_type這個值的,從而也就沒法得出和數據庫中一致的subscription_id值,最終導致無法從數據庫中查詢到一條通話記錄。

解決方法:
藍牙服務層在存儲通話記錄的CallLog.Calls.PHONE_ACCOUNT_ID(subscription_id)值採用藍牙設備的地址,也就是上述的name代替轉換生成的hashCode值,最後數據庫中的存儲值如下圖。
在這裏插入圖片描述

問題2:
數據庫中存儲的電話號碼有格式,比如:1-xxx-xxx-xxxx,這樣藍牙電話應用從數據庫中取出電話號碼需要做去格式的處理,相當麻煩。

分析源碼後,電話號碼格式的轉換髮生於數據從手機端同步過來後解析數據的過程中:VCardEntry. addPhone()
在這裏插入圖片描述

解決方法:
如果應用apk不嫌麻煩做去格式處理,那底層服務就省事了,哈哈。

建議底層存儲數據時不要轉換格式,直接將電話號碼存入數據庫即可,方便你我他。規避方案:
在這裏插入圖片描述

後續PBAP同步電話薄遇到些奇怪問題再做更新,本期就分享上面兩個問題,感興趣的小夥伴歡迎私信留言一起討論。

更多互聯互通技術,歡迎關注微信公衆號:Connectivity
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章