以下是一个简单的BluetoothService类的示例,用于连接蓝牙设备并读取数据:
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
public class BluetoothService extends Service {
private static final String TAG = "BluetoothService";
private BluetoothAdapter mBluetoothAdapter;
private ConnectThread mConnectThread;
private ConnectedThread mConnectedThread;
private BluetoothDevice mDevice;
private UUID mUUID;
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
BluetoothService getService() {
return BluetoothService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 获取要连接的蓝牙设备和UUID
String deviceAddress = intent.getStringExtra("device_address");
mDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress);
mUUID = UUID.fromString(intent.getStringExtra("uuid"));
// 开始连接蓝牙设备
connectToDevice();
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mConnectThread != null) {
mConnectThread.cancel();
}
if (mConnectedThread != null) {
mConnectedThread.cancel();
}
}
private synchronized void connectToDevice() {
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// 开始连接蓝牙设备
mConnectThread = new ConnectThread(mDevice, mUUID);
mConnectThread.start();
}
private synchronized void connected(BluetoothSocket socket) {
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
// 开始读取数据
mConnectedThread = new ConnectedThread(socket);
mConnectedThread.start();
}
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public ConnectThread(BluetoothDevice device, UUID uuid) {
mmDevice = device;
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
Log.e(TAG, "Socket create() failed", e);
}
mmSocket = tmp;
}
public void run() {
mBluetoothAdapter.cancelDiscovery();
try {
mmSocket.connect();
} catch (IOException connectException) {
try {
mmSocket.close();
} catch (IOException closeException) {
Log.e(TAG, "Could not close the client socket", closeException);
}
return;
}
connected(mmSocket);
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close the client socket", e);
}
}
}
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) {
Log.e(TAG, "Error occurred when creating input/output stream", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
// 在这里处理读取到的数据
} catch (IOException e) {
Log.e(TAG, "Error occurred when reading from input stream", e);
break;
}
}
}
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
Log.e(TAG, "Error occurred when writing to output stream", e);
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close the connect socket", e);
}
}
}
}
该示例中,BluetoothService类实现了蓝牙连接和数据读取的逻辑。在onStartCommand()方法中,获取要连接的蓝牙设备和UUID,并调用connectToDevice()方法开始连接蓝牙设备。在connectToDevice()方法中,创建一个ConnectThread线程用于连接蓝牙设备。在connected()方法中,创建一个ConnectedThread线程用于读取数据。在ConnectedThread线程中,使用mmInStream.read(buffer)方法读取数据,并在其中处理读取到的数据。