Android对于蓝牙开发从2.0版本的sdk才开始支持,并且模拟器不支持,测试至少须要两部手机,因此制约了不少技术人员的开发。
首先,要操做蓝牙,先要在AndroidManifest.xml里加入权限
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
而后,看下api,Android全部关于蓝牙开发的类都在android.bluetooth包下,以下图,只有8个类
而咱们须要用到了就只有几个而已:
1.BluetoothAdapter 顾名思义,蓝牙适配器,直到咱们创建bluetoothSocket链接以前,都要不断操做它
BluetoothAdapter里的方法不少,经常使用的有如下几个:
cancelDiscovery() 根据字面意思,是取消发现,也就是说当咱们正在搜索设备的时候调用这个方法将再也不继续搜索
disable()关闭蓝牙
enable()打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候咱们须要问下用户是否打开,一下这两行代码一样是打开蓝牙,不过会提示用户:
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);//同startActivity(enabler);
getAddress()获取本地蓝牙地址
getDefaultAdapter()获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter
getName()获取本地蓝牙名称
getRemoteDevice(String address)根据蓝牙地址获取远程蓝牙设备
getState()获取本地蓝牙适配器当前状态(感受可能调试的时候更须要)
isDiscovering()判断当前是否正在查找设备,是返回true
isEnabled()判断蓝牙是否打开,已打开返回true,不然,返回false
listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID建立并返回BluetoothServerSocket,这是建立BluetoothSocket服务器端的第一步
startDiscovery()开始搜索,这是搜索的第一步
2.BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备
createRfcommSocketToServiceRecord(UUIDuuid)根据UUID建立并返回一个BluetoothSocket
这个方法也是咱们获取BluetoothDevice的目的——建立BluetoothSocket
这个类其余的方法,如getAddress(),getName(),同BluetoothAdapter
3.BluetoothServerSocket若是去除了Bluetooth相信你们必定再熟悉不过了,既然是Socket,方法就应该都差很少,
这个类一种只有三个方法
两个重载的accept(),accept(inttimeout)二者的区别在于后面的方法指定了过期时间,须要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过时以后),都会阻塞线程,应该放在新线程里运行!
还有一点须要注意的是,这两个方法都返回一个BluetoothSocket,最后的链接也是服务器端与客户端的两个BluetoothSocket的链接
close()这个就不用说了吧,翻译一下——关闭!
4.BluetoothSocket,跟BluetoothServerSocket相对,是客户端
一共5个方法,不出意外,都会用到
close(),关闭
connect()链接
getInptuStream()获取输入流
getOutputStream()获取输出流
getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定链接的那个远程蓝牙设备
(三):
1. 概述
Bluetooth 是几乎如今每部手机标准配备的功能,多用于耳机 mic 等设备与手机的链接,除此以外,还能够多部手机之间创建 bluetooth 通讯,本文就经过 SDK 中带的一个聊天室的例程,来介绍一下 Android 上的 Bluetooth 的开发。
在 Android1.x 的时候,相关 API 很是不完善,还不能简单的使用 Bluetooth 开发,有一个开源项目能够帮助程序员使用、开发蓝牙,支持直接方法bluetooth 协议栈。在 Android2 之后,框架提供了一些官方 API 来进行蓝牙的通讯,但目前的程序也比较不完善。本文主要讨论 Android2 后的Bluetooth 通讯的 API 使用方法。
首先看聊天室的效果图:

2. Bluetooth 通讯 API 介绍2.1. Bluetooth 通讯过程

2.2. Bluetooth API 的主要方法
BluetoothAdapter 类
BluetoothAdapter.getDefaultAdapter() :获得本地默认的 BluetoothAdapter ,若返回为 null 则表示本地不支持蓝牙;
isDiscovering() :返回设备是否正在发现周围蓝牙设备;
cancelDiscovery() :取消正在发现远程蓝牙设备的过程;
startDiscovery() :开始发现过程;
getScanMode() :获得本地蓝牙设备的 Scan Mode ;
getBondedDevices() :获得已配对的设备;
isEnabled() :蓝牙功能是否启用。
当发现蓝牙功能未启用时,以下调用设置启用蓝牙:
if (! mBluetoothAdapter .isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter. ACTION_REQUEST_ENABLE );
startActivityForResult(enableIntent, REQUEST_ENABLE_BT );
}
复制代码
若是发现当前设备没有打开对外可见模式,则传递 Intent 来调用打开可发现模式,代码以下:
Intent discoverableIntent = new Intent(BluetoothAdapter. ACTION_REQUEST_DISCOVERABLE ); discoverableIntent.putExtra(BluetoothAdapter. EXTRA_DISCOVERABLE_DURATION , 300);
startActivity(discoverableIntent);
复制代码
BluetoothDevice 类,此为对应的远程蓝牙 Device
createRfcommSocketToServiceRecord() :建立该 Device 的 socket 。
BluetoothSocket 类
connect() :请求链接蓝牙。
getInputStream() :获得输入流,用于接收远程方信息。
getOutputStream() :获得输出流,发送给远程方的信息。
close() :关闭蓝牙链接。
InputStream 类:
read(byte[]) :以阻塞方式读取输入流。
OutputStream 类:
write(byte[]) :将信息写入该输出流,发送给远程。
..
3. BluetoothChat 例程分析
Google 提供的关于 Bluetooth 开发的例程为 Bluetoothchat ,使用截图可见本文一开始。除去配置及 ui 定义等文件,主程序文件共三个:BluetoothChat.java 、 BluetoothChatService.java 以及 DeviceListActivity.java ,详细功能可见下面的描述。
3.1. 总体调用关系序列图

3.2. BluetoothChat.java
例程的主 Activity 。 onCreate() 获得本地 BluetoothAdapter 设备,检查是否支持。 onStart() 中检查是否启用蓝牙,并请求启用,而后执行 setupChat()。 setupChat() 中先对界面中的控件进行初始化增长点击监听器等,然建立 BluetoothChatService 对象,该对象在整个应用过程当中存在,并执行蓝牙链接创建、消息发送接受等实际的行为。
3.3. BluetoothChatService.java
public synchronized void start() :
开启 mAcceptThread 线程,因为样例程序是仅 2 人的聊天过程,故以前先检测 mConnectThread 和 mConnectedThread 是否运行,运行则先退出这些线程。
public synchronized void connect(BluetoothDevice device) :
取消 CONNECTING 和 CONNECTED 状态下的相关线程,而后运行新的 mConnectThread 线程。
public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) :
开启一个 ConnectedThread 来管理对应的当前链接。以前先取消任意现存的 mConnectThread 、 mConnectedThread 、 mAcceptThread 线程,而后开启新 mConnectedThread ,传入当前刚刚接受的 socket 链接。最后经过 Handler 来通知 UI 链接 OK 。
public synchronized void stop() :
中止全部相关线程,设当前状态为 NONE 。
public void write(byte[] out) :
在 STATE_CONNECTED 状态下,调用 mConnectedThread 里的 write 方法,写入 byte 。
private void connectionFailed() :
链接失败的时候处理,通知 ui ,并设为 STATE_LISTEN 状态。
private void connectionLost() :
当链接失去的时候,设为 STATE_LISTEN 状态并通知 ui 。
内部类:
private class AcceptThread extends Thread :
建立监听线程,准备接受新链接。使用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。
private class ConnectThread extends Thread :
这是定义的链接线程,专门用来对外发出链接对方蓝牙的请求和处理流程。构造函数里经过 BluetoothDevice.createRfcommSocketToServiceRecord(),从待链接的 device 产生 BluetoothSocket. 而后在 run 方法中 connect ,成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时可以关闭相关 socket 。
private class ConnectedThread extends Thread :
这个是双方蓝牙链接后一直运行的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的 InputStream.read() 循环读取输入流, 而后 post 到UI 线程中更新聊天消息。也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭链接的 socket 。
3.4. DeviceListActivity.java
该类包含 UI 和操做的 Activity 类,做用是获得系统默认蓝牙设备的已配对设备列表,以及搜索出的未配对的新设备的列表。而后提供点击后发出链接设备请求的功能。
除了 RFCOMM 通讯外, Android 上关于 Bluetooth 的还有 SDP 、 GAP 、耳机设备链接等内容,本文还未涉及,将会随着蓝牙相关 API 在新版本中的进一步完善来学习使用。