蓝牙电话之PBAP-同步电话簿的几点注意事项

蓝牙电话之PBAP-同步电话簿的几点注意事项

蓝牙电话之PBAP-同步电话簿的几点注意事项_第1张图片

使用原生安卓同步完电话簿数据后,蓝牙服务层会直接将从手机端同步到的数据写入数据库,辅以同步状态的上报,这样蓝牙电话应用就知道何时触发从数据库中取出相应的联系人和通话记录等数据。

然而实际运行测试下来也发现了不少问题,所以此篇就是简单记录下PBAP同步数据存储这块遇到的问题,以供大家参考。

问题1:
/data/data/com.android.providers.contacts/databases/calllog.db
通话记录表中subscription_id这一列存储的是一个hashCode值,该值为Account的hash值,其组成如下图:
蓝牙电话之PBAP-同步电话簿的几点注意事项_第2张图片

  • name 就是当前同步电话簿数据的远端蓝牙设备地址
  • type 就是当前的pbap_account_type类型值,详细参数可以参考如下路径中定义的string值:
    packages\apps\Bluetooth\res\values\strings_pbap_client.xml
    蓝牙电话之PBAP-同步电话簿的几点注意事项_第3张图片

对同一个蓝牙设备而言,由于其地址不会改变,且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值,最后数据库中的存储值如下图。
蓝牙电话之PBAP-同步电话簿的几点注意事项_第4张图片

问题2:
数据库中存储的电话号码有格式,比如:1-xxx-xxx-xxxx,这样蓝牙电话应用从数据库中取出电话号码需要做去格式的处理,相当麻烦。

分析源码后,电话号码格式的转换发生于数据从手机端同步过来后解析数据的过程中:VCardEntry. addPhone()
蓝牙电话之PBAP-同步电话簿的几点注意事项_第5张图片

解决方法:
如果应用apk不嫌麻烦做去格式处理,那底层服务就省事了,哈哈。

建议底层存储数据时不要转换格式,直接将电话号码存入数据库即可,方便你我他。规避方案:
蓝牙电话之PBAP-同步电话簿的几点注意事项_第6张图片

后续PBAP同步电话薄遇到些奇怪问题再做更新,本期就分享上面两个问题,感兴趣的小伙伴欢迎私信留言一起讨论。

更多互联互通技术,欢迎关注微信公众号:Connectivity
蓝牙电话之PBAP-同步电话簿的几点注意事项_第7张图片

你可能感兴趣的:(Bluetooth)