类微信实现Bluetooth聊天
需求要求:两个连接的手机选择后可进行蓝牙聊天
以下为部分核心代码展示
要想实现蓝牙聊天,首先需要获得蓝牙权限,在项目的配置文件AndroidManifest.xml加入下面两条代码
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
检查该设备是否支持蓝牙连接
private void isSupportBluetooth() {
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null
|| !getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
showNotSupportBluetoothDialog();
Log.e(TAG, "not support bluetooth");
} else {
Log.e(TAG, " support bluetooth");
}
}
主动发起连接的线程ConnectThread
private class ConnectThread extends Thread{
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device){
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
mmDevice=device;
BluetoothSocket tmp = null;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try{
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
}catch (IOException e){}
mmSocket = tmp;
}
public void run(){
// Cancel discovery because it will slow down the connection
mAdapter.cancelDiscovery();
try{
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
}catch (IOException e){
connectionFailed();
// Unable to connect; close the socket and get out
try{
mmSocket.close();
}catch (IOException e2){}
//ChatService.this.start();
return;
}
synchronized(ChatService.this){
mConnectedThread = null;
}
connected(mmSocket,mmDevice);
}
public void cancel(){
/* try{
mmSocket.close();
}catch (IOException e){}*/
}
}
蓝牙配对成功后,通过BluetoothDevice的createRfcommSocketToServiceRecord()方法和蓝牙设备连接,返回BluetoothSocket对象,进而获得输入输出流,进行数据交互。
mSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
mSocket.connect();
mOutputStream = mSocket.getOutputStream();
mInputStream = mSocket.getInputStream();
复制代码
构造函数中设置输入输出流, run()方法中使用阻塞模式的 InputStream.read()循环读取输入流,然后发送到 UI 线程中更新聊天消息,本线程也提供了 write() 将聊天消息写入输出流传输至对方,传输成功后回写入 UI 线程。最后使用cancel()关闭连接的 socket
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(weixinFragment.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
connectionLost();
break;
}
}
}
public void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
mHandler.obtainMessage(weixinFragment.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
源码地址:https://gitee.com/zhangjianhui1010/lanyatongxin