在 android 系统上通过蓝牙获取通讯录

在 android 系统上通过蓝牙获取通讯录

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

前言:

最近在研究通过蓝牙通讯协议中的 PhoneBookAccessProfile(简称 PBAP) 来获取其它智能手机中的通讯录。我们的目标是,在 android 端运行程序,该程序通过某个蓝牙协议通过无线的方式获取另一个手机上的通讯录。这里,“另一个手机”可以是 android 设备也可以是 ios 设备。这也是我们选择采用蓝牙协议的一个原因:在某种程度上跨平台。

几种常见的蓝牙协议:

Protocol Abbreviation Benefit
Advanced Audio Distribution Protocol A2DP Audio streaming
Audio/Video Remote Control Protocol AVRCP Control over music playback directly from the stereo
Hands-free Profile HFP Hands-free calling through the stereo
Object Push Profile OPP Uploading of contact info to the stereo
Phone Book Access Profile PBAP Access to contact list from the stereo

表格中的 stereo 其实泛指我们使用的蓝牙设备。根据表格中的描述,想利用蓝牙协议来获取其他设备中的通讯录,用 PhoneBookAccessProfile(PBAP) 协议就可以了。先不考虑代码逻辑,通讯录的获取流程如下:

  1. 两个蓝牙设备配对
  2. 一端发起获取通讯录的请求
  3. 另一端会以某种方式(最常见的是弹窗)来请求本人授权
  4. 发起请求端获取通讯录数据

事实上,蓝牙连接中,两个设备间是不对等、不对称的。一定会出现一个设备扮演客户端的角色,另一个设备扮演服务端的角色。客户端需要做的就是去发出某种请求,然后接受并处理服务端的返回数据;服务端需要做的就是一直监听是否有请求发过来,然后对请求做出响应。整个机制跟 web 开发的流程是极其相似的,是可以无缝类比的。

android 对于蓝牙开发的支持

android 本身对于蓝牙协议进行了高度的封装。不过有的代码可以在 android 官方文档中查看到相关解释,有的确只能自己翻代码去看。
The BluetoothAdapter is the entry-point for all Bluetooth interaction. 正如文档中所言,首先我们需要调用

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

来获得 BluetoothAdapter 实例,然后需要通过这个实例获取 BluetoothDevice 实例。这里做类似的调用:

Set<BluetoothDevice> pairedDevices = adapter.getBondedDevices();
BluetoothDevice device = (BluetoothDevice) pairedDevices.toArray()[0];

首先通过 getBondedDevices() 来获得一个已配对的设备的集合 pairedDevices。然后可以调用paredDevices.toArray()将集合转化成数组。数组里面的每一项都是一个 BluetoothDevice 实例。针对 android 开发,一般情况下会显示一个列表,列表里面的数据源自device.getAddress() 以及 device.getName(),分别代表蓝牙设备的地址以及名字。然后让用户手动选择一个蓝牙设备去连接。在 onClick() 事件中,可以调用 adapter.getRemoteDevie(String address) 来通过蓝牙设备地址来访问该设备。
获取到 BluetoothDevice 实例后,可以调用

BluetoothPbapClient client = new BluetoothPbapClient(device, yourHandler);
client.connect();
client.pullPhoneBook(BluetoothPbapClient.PB_PATH);
client.disconnect();

来完成通讯录的获取。其中,new BluetoothPbapClient(device, yourHandler);的 yourHandler 参数需要传一个 Handler 实例。利用 Handler 处理信息在 android 开发中已经非常常见了。在传入 yourHandler 实例之后,你就可以在它的 handleMessage(Message msg)函数中处理 BluetoothPbapClient 实例在工作的过程中发出的消息。比如,接收到 EVENT_PULL_PHONE_BOOK_DONE 信息后,输出一下通讯录的内容或者基于通讯录做一些其他事情等。代码如下:

    public static class BluetoothServiceHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            LogUtil.d(msg);
            switch (msg.what) {
                case BluetoothPbapClient.EVENT_PULL_PHONE_BOOK_DONE: {
                    LogUtil.d("EVENT_PULL_PHONE_BOOK_DONE");
                    sPbapClient.disconnect();
                }
                break;
                default: {
                }
            }
        }
    }

注意:关于 BluetoothPbapClient 相关的类,需要在 android 源代码中找,找到后直接 copy 到我们的工程下就好。需要用到的有:android.bluetooth.client.pbap.*;com.android.vcard.*javax.obex.*。而且,这里有个小坑,就是低版本的 sdk 里面,相关的源代码写的有问题,需要到高版本的里面找,才能正确编译。本人用的是 android-23 里面的文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 前言 最近在做Android蓝牙这部分内容,所以查阅了很多相关资料,在此总结一下。 基本概念 Bluetooth是...
    猫疏阅读 14,241评论 7 113
  • 蓝牙 注:本文翻译自https://developer.android.com/guide/topics/conn...
    RxCode阅读 8,482评论 11 99
  • 2017 07 26 雨转晴 最近真的是懒炸了
    邵依旧阅读 141评论 0 0
  • 上周日,和几个姐妹们一起沙龙,每周的姐妹沙龙聚会,沙龙上可以分享育儿经验,可以吐槽生活中的大小烦心事,对每一位妈妈...
    雪绒花飞阅读 250评论 0 2