今日科技快讯

Android O开发者预览版终于推出了!大家可以访问下面的网址:

https://developer.android.google.cn/preview

来了解Android O的新功能:后台限制、通知渠道、自适应图标、XML中的字体资源、自动调整TextView大小等等。

作者简介

之前其实有很多朋友都留过言,问我能不能分享一些蓝牙开发相关的文章。尴尬的是一直都没有人投稿过这方面的文章,我也实在是无文可发。那么今天终于能满足这部分朋友的要求了,本篇来自codingzxon 的投稿,分享了如何使用蓝牙获取通讯录,希望能够帮助到大家。

codingzxon 的博客地址:

http://www.jianshu.com/u/a560f302e17a

前言

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

几种常见的蓝牙协议

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

1. 两个蓝牙设备配对

2. 一端发起获取通讯录的请求

3. 另一端会以某种方式(最常见的是弹窗)来请求本人授权

4. 发起请求端获取通讯录数据

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

Android对蓝牙开发的支持

android 本身对于蓝牙协议进行了高度的封装。不过有的代码可以在 android 官方文档中查看到相关解释,有的确只能自己翻代码去看。

The BluetoothAdapter is the entry-point for all Bluetooth interaction.

https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html

正如文档中所言,首先我们需要调用:

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

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

首先通过getBondedDevices()来获得一个已配对的设备的集合 pairedDevices。然后可以调用paredDevices.toArray()将集合转化成数组。数组里面的每一项都是一个 BluetoothDevice 实例。

针对 android 开发,一般情况下会显示一个列表,列表里面的数据源自device.getAddress()以及device.getName(),分别代表蓝牙设备的地址以及名字。然后让用户手动选择一个蓝牙设备去连接。在onClick()事件中,可以调用adapter.getRemoteDevie(String address)来通过蓝牙设备地址来访问该设备。

获取到 BluetoothDevice 实例后,可以调用

来完成通讯录的获取。其中,new BluetoothPbapClient(device, yourHandler)的 yourHandler 参数需要传一个 Handler 实例。利用 Handler 处理信息在 android 开发中已经非常常见了。

在传入 yourHandler 实例之后,你就可以在它的handleMessage(Message msg)函数中处理 BluetoothPbapClient 实例在工作的过程中发出的消息。比如,接收到 EVENT_PULL_PHONE_BOOK_DONE 信息后,输出一下通讯录的内容或者基于通讯录做一些其他事情等。代码如下:

注意:关于 BluetoothPbapClient 相关的类,需要在 android 源代码中找,找到后直接 copy 到我们的工程下就好。

需要用到的有:android.bluetooth.client.pbap.*;,com.android.vcard.*,javax.obex.*。而且,这里有个小坑,就是低版本的 sdk 里面,相关的源代码写的有问题,需要到高版本的里面找,才能正确编译。本人用的是 android-23 里面的文件。

更多

每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。

如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号:

更多相关文章

  1. Android 通过读取本地Arp表获取当前局域网内其他设备信息
  2. 关于利用android-serialport-api实现在安卓设备上进行串口通信,附
  3. Android与PC蓝牙交互
  4. 如何在Android设备中创建Web服务器(用于远程访问)
  5. 让Android 设备通过USB 转RJ45有线网卡上网
  6. android BluetoothAdapter蓝牙BLE扫描总结
  7. android设备中的临时文件夹在哪里?
  8. 不同Android版本设备正确获取屏幕分辨率的通用方法
  9. android init进程分析 ueventd — 设备节点的创建、固件更新过

随机推荐

  1. golang web开发乱码的原因与解决方法
  2. golang与java语法上的区别
  3. golang-cache是全局吗
  4. golang中使用rand产生随机不重复数字
  5. golang中fscanf读取文件时把回车替换成0
  6. golang 包怎么调用
  7. golang 1.9什么时候发布
  8. golang中的print与fmt的区别
  9. golang中的错误处理方法
  10. golang中的int占几个字节