獲取到設備後就可以開始處理藍牙設備之間的連接。
在上一篇教程中我們將搜索到的藍牙設備展示在列表中,現在我們爲列表項增加上點擊事件。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (bTAdatper.isDiscovering()) {
bTAdatper.cancelDiscovery();
}
BluetoothDevice device = (BluetoothDevice) adapter.getItem(position);
connectDevice(device);
}
});
當我們點擊了列表項後,如果藍牙設備當前處於搜索狀態,則取消搜索。獲取到列表項相對應的藍牙設備後調用連接方法。
/**
* 連接藍牙設備
*/
private void connectDevice(BluetoothDevice device) {
text_state.setText(getResources().getString(R.string.connecting));
try {
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(BT_UUID);
connectThread = new ConnectThread(socket, true);
connectThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
可以看到,在connectDevice()方法中,首先用一個TextView提示連接狀態,然後用我們選擇的設備調用createRfcommSocketToServiceRecord(UUID uuid)獲取BluetoothSocket。最後開啓一個線程去處理BluetoothSocket。
這裏需要注意的是傳入的UUID。UUID是Universally Unique Identifier的縮寫,它是在一定的範圍內(從特定的名字空間到全球)唯一的機器生成的標識符。我們在連接藍牙設備的時候,必須確保兩個設備的UUID是相同的。通常UUID是16字節128位長的數字,通常以36字節的字符串表示,示例如下:
3F2504E0-4F89-11D3-9A0C-0305E82C3301。
if (activeConnect) {
socket.connect();
}
text_state.post(new Runnable() {
@Override
public void run() {
text_state.setText(getResources().getString(R.string.connect_success));
}
});
在創建線程的時候我們會傳入布爾變量activeConnect做標識,區分是自動連接還是被動連接。當是自動連接狀態,則調用BluetoothSocket的connect()進行連接。
而被動連接的做法主要是開啓一個監聽線程,監聽是否有設備連接到我們的設備上,具體代碼如下:
listenerThread = new ListenerThread();
listenerThread.start();
在onCreate()方法中開啓監聽線程
private BluetoothServerSocket serverSocket;
private BluetoothSocket socket;
@Override
public void run() {
try {
serverSocket = bTAdatper.listenUsingRfcommWithServiceRecord(
NAME, BT_UUID);
while (true) {
socket = serverSocket.accept();
text_state.post(new Runnable() {
@Override
public void run() {
text_state.setText(getResources().getString(R.string.connecting));
}
});
connectThread = new ConnectThread(socket, false);
connectThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
監聽線程中的代碼很簡單,首先是獲取BluetoothServerSocket,這裏需要用到UUID必須確保和自動連接所用到的UUID是相同的,而對於NAME就沒什麼要求。接着我們就調用accept()方法。這個方法會阻塞住當前的線程,直到有設備連接上來。當有設備連接上來,則可以獲取到對應的BluetoothSocket。到這裏被動連接就成功了。接着我們只要把獲取到的BluetoothSocket交由連接線程ConnectThread去處理就行了。
歡迎繼續閱讀下一篇
Android藍牙開發教程(三)——藍牙設備相互通訊