安卓蓝牙App开发流程
在开发安卓蓝牙应用时,需要遵循以下基本流程:
1. 获取蓝牙权限
在 AndroidManifest.xml 文件中,添加以下两个权限请求:
```xml
```
如果需要连接到 BLE 设备,还需要添加一个定位权限:
```xml
```
2. 检查蓝牙硬件是否可用
在编写应用时,需要确保设备支持蓝牙,并且蓝牙已经开启。可以通过获取 BluetoothAdapter 实例来实现这个功能:
```java
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
// 设备不支持蓝牙,提示用户
}
if (!bluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
```
3. 搜索设备
在寻找并匹配目标设备前,请确保设备是可以被发现的。可以通过调用以下方式使设备在蓝牙设置中被发现:
```java
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
```
接着,使用 BroadcastReceiver 来侦听找到的设备:
```java
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 获取设备名字和地址,并进行下一步操作
String deviceName = device.getName();
String deviceAddress = device.getAddress();
}
}
};
// 注册 Broadcast Receiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);
```
4. 连接设备
在找到目标设备后,通过其 MAC 地址建立连接。需要创建一个 BluetoothSocket 对象,并调用其 connect 方法。
```java
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
public ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
Log.e(TAG, "Socket's create() method failed", e);
}
mmSocket = tmp;
}
public void run() {
// Cancel discovery because it otherwise slows down the connection.
bluetoothAdapter.cancelDiscovery();
try {
// Connect to the remote device through the socket.
mmSocket.connect();
} catch (IOException e) {
// Unable to connect; close the socket and return.
try {
mmSocket.close();
} catch (IOException closeException) {
Log.e(TAG, "Could not close the client socket", closeException);
}
return;
}
// 蓝牙连接成功, 可以进行数据传输操作
}
// Closes the client socket and causes the thread to finish.
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close the client socket", e);
}
}
}
```
5. 数据传输
可以通过获取输入输出流进行数据的发送和接收。
```java
private InputStream mmInStream;
private OutputStream mmOutStream;
// 在 ConnectThread 的 run 方法中调用以下代码来获取输入输出流:
mmInStream = mmSocket.getInputStream();
mmOutStream = mmSocket.getOutputStream();
```
创建一个新线程来从输入流中读取数据:
```java
private class ReadThread extends Thread {
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
//处理接收到的数据
} catch (IOException e) {
//读取数据出现错误
break;
}
}
}
}
```
将数据写入输出流进行发送:
```java
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
//发送数据出现错误
}
}
```
6. 断开连接
断开连接时需要关闭输入输出流和 BluetoothSocket。
```java
public void cancel() {
try {
mmInStream.close();
mmOutStream.close();
mmSocket.close();
} catch (IOException e) {
//关闭资源出现错误
}
}
```
这就是安卓蓝牙应用开发的基本步骤。在掌握这些基本知识后,你可以尝试开发更复杂的蓝牙应用,例如 BLE 设备等。