2012-06-07 54 views
8

我到處看,我發現這個方法「getBondedDevices()」爲我的藍牙適配器。但是,我的平板電腦和另一個藍牙設備位於我旁邊,我無法弄清楚如何讓設備顯示在綁定設備列表中。我該如何實際綁定設備?

回答

20

在藍牙術語中,「bonded」和「paired」基本上是同義詞(官方,配對過程導致債券,但大多數人使用它們可互換)。爲了讓您的設備被添加到該列表中,您必須通過發現的過程,這是一個設備如何搜索和發現另一個,然後兩個在一起。

實際上,你可以從設備設置爲用戶做到這一點,但如果你正在尋找這樣使一個應用程序的環境中,你的程序可能會是這個樣子:

  1. 註冊一個BroadcastReceiverBluetoothDevice.ACTION_FOUND,並通過調用BluetoothAdapter.startDiscovery()BluetoothAdapter. ACTION_DISCOVERY_FINISHED
  2. 開始發現
  3. 接收機將讓每一個新的設備在範圍內發現的時間稱爲與第一動作,你可以檢查它,看它是否是你要連接的一個。一旦您發現它不會浪費電池,您可以撥打BluetoothAdapter.cancelDiscovery()
  4. 當發現完成時,如果你還沒有取消它,你的接收器將被第二個動作調用;所以你不知道更多的設備。
  5. 手頭有設備實例,請打開BluetoothSocketconnect()。如果設備尚未綁定,這將啓動配對,並可能顯示一些系統UI以獲取PIN碼。
  6. 配對後,您的設備將顯示在保稅設備列表中,直到用戶進入設置並將其刪除。
  7. connect()方法也實際上打開套接字鏈接,並且當它返回時沒有拋出異常兩個設備連接。
  8. 現在連接好了,可以從socket中調用getInputStream()getOutputStream()來讀寫數據。

基本上,您可以檢查綁定設備列表以快速訪問外部設備,但在大多數應用程序中,您將結合使用此發現和真正發現來確保始終可以連接到遠程設備,而不管用戶做什麼。如果一個設備已經綁定,你只需要執行步驟5-7來連接和通信。

有關更多信息和示例代碼,請查看Android SDK Bluetooth Guide的「發現設備」和「連接設備」部分。

HTH

+0

非常感謝您的幫助。雖然我目前被困在第5步。在我的onReceive方法中,我將找到的設備添加到列表中,但是就我所知。我正在尋找BluetoothSocket構造函數的文檔,但還沒有找到。我是否簡單地創建一個對象,調用其上的「connect()」函數,然後這些設備將出現在我的綁定設備列表中?發現的設備位於ArrayAdapter 數據結構中,我無法理解在新對象上調用connect()將爲我執行所有操作的想法。 – JuiCe

+1

如果您閱讀我關聯的開發指南,您會在連接示例中注意到使用createRfcommSocketToServiceRecord()方法從設備生成套接字對象。 – Devunwired

+0

對不起,我已經瀏覽了指南,但我仍然有點困惑。我正在使用手機/平板電腦連接到另一個不是手機/平板電腦的藍牙設備。這可能看起來微不足道,但我無法說服自己我理解它,當我將BluetoothSocket添加到對象時,我的手機/平板電腦充當服務器,對嗎?我也很困惑,它說調用'connect()'開始監聽設備,但我已經找到了設備並有它的地址。它究竟會在聽什麼? – JuiCe

0

API級別19和BluetoothDevice類instace上面你可以調用createBond()到要連接。 您將需要一些權限,以發現並列出可見的設備

<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

代碼,以發現並列出設備:

bluetoothFilter.addAction(BluetoothDevice.ACTION_FOUND); 
bluetoothFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
bluetoothFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
registerReceiver(bluetoothReceiver, bluetoothFilter); 
private BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_FOUND"); 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       devicesList.add((device.getName() != null ? device.getName() : device.getAddress())); 
       bluetoothDevicesAdapter.notifyDataSetChanged(); 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_DISCOVERY_STARTED"); 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       Log.e("bluetoothReceiver", "ACTION_DISCOVERY_FINISHED"); 
       getActivity().unregisterReceiver(bluetoothReceiver); 
      } 
     } 
}; 

選擇的設備上只需撥打createBond()。

相關問題