Android 手機(Central/主設備) ↔ 藍牙模塊(Peripheral/從設備,如 HC-05/06、BLE 模塊)。通信流程:掃描 → 配對/綁定 → 連接 → 建立 Socket → 發送/接收字節流。
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 需額外聲明 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
Set pairedDevices = btAdapter.getBondedDevices();
BluetoothDevice targetDevice = null;
for (BluetoothDevice d : pairedDevices) {
if (d.getName().equals("HC-05")) { targetDevice = d; break; }
}
if (targetDevice != null) {
// 異步連接,避免阻塞 UI 線程
new Thread(() -> {
try {
BluetoothSocket socket = targetDevice.createRfcommSocketToServiceRecord(
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // SPP 服務 UUID
socket.connect(); // 阻塞直到連接成功
// 連接成功,保存 socket 輸入/輸出流
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// 發送指令示例
out.write(new byte[] {0x01, 0x02, 0x03}); // 協議自定義
out.flush();
} catch (IOException e) { e.printStackTrace(); }
}).start();
}
new Thread(() -> {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = in.read(buffer);
if (bytes > 0) {
final byte[] data = Arrays.copyOf(buffer, bytes);
runOnUiThread(() -> handleReceivedData(data)); // 回調 UI 更新
}
} catch (IOException e) { break; } // 連接斷開
}
}).start();
Android 藍牙聊天/控制完整項目(含 Eclipse/Android Studio 版)
00001101-0000-1000-8000-00805F9B34FB)。runOnUiThread 或 Handler。connect() 可能拋出 IOException,需捕獲並提示用戶重試。ACCESS_FINE_LOCATION(掃描藍牙需要),否則 startDiscovery() 靜默失敗。