Google 提供的关于 Bluetooth 开发的例程为 Bluetoothchat。除去配置及 UI定义等文

件, 主程序文件共三个: BluetoothChat.java 、BluetoothChatService.java 以及

DeviceListActivity.java ,详细功能可见下面的描述。

1.BluetoothChat.java

例程的主 Activity 。 onCreate() 得到本地 BluetoothAdapter 设备,检查是否支持。

onStart() 中检查是否启用蓝牙,并请求启用,然后执行 setupChat()。setupChat() 中

先对界面中的控件进行初始化增加点击监听器等,然创建BluetoothChatService 对象,该

对象在整个应用过程中存在,并执行蓝牙连接建立、消息发送接受等实际的行为。

2.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

用阻塞方式,调用 BluetoothServerSocket.accept() 。提供 cancel 方法关闭 socket 。

private class ConnectThread

外发出连接对方蓝牙的请求和处理流程。构造函数里通过

BluetoothDevice.createRfcommSocketToServiceRecord() , 从待连接的device 产生

BluetoothSocket. 然后在 run 方法中 connect ,成功后调用BluetoothChatSevice 的

connected() 方法。定义 cancel() 在关闭线程时能够关闭相关 socket 。

private class ConnectedThread

的线程。构造函数中设置输入输出流。 Run 方法中使用阻塞模式的InputStream.read() 循

环读取输入流, 然后 post 到UI 线程中更新聊天消息。也提供了 write() 将聊天消息写

入输出流传输至对方,传输成功后回写入 UI 线程。最后 cancel() 关闭连接的 socket 。

3.DeviceListActivity.java

该类包含 UI 和操作的 Activity 类,作用是得到系统默认蓝牙设备的已配对设备列

表,以及搜索出的未配对的新设备的列表。然后提供点击后发出连接设备请求的功能。



BluetoothDevice 类,此为对应的远程蓝牙 Device

createRfcommSocketToServiceRecord() :创建该 Device 的 socket 。

BluetoothSocket 类

connect() :请求连接蓝牙。

getInputStream() :得到输入流,用于接收远程方信息。

getOutputStream() :得到输出流,发送给远程方的信息。

close() :关闭蓝牙连接。

InputStream 类:

read(byte[]) :以阻塞方式读取输入流。

OutputStream 类:

write(byte[]) :将信息写入该输出流,发送给远程。