蓝牙电话之PBAP同步电话簿的安卓实现

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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44260005/article/details/108618835