2011-07-06 98 views
3

我正在寫一個程序,通過rfcomm與外部附件進行通話。 我的問題是,我不知道識別我的設備的正確方法是什麼。 我現在做的方式是這樣的:Android上的藍牙 - 如何連接到正確的藍牙設備?

Set<BluetoothDevice> pairedDevices = mBluetoothAdapter 
       .getBondedDevices(); 
     for (BluetoothDevice device : pairedDevices) { 
      if (device.getName().equals(MY_DEVICE_NAME)) { 
       this.myDevice = device; 
       break; 
      } 
     } 

但是,這種方法依賴於這對我來說似乎是骯髒和壞:) 有沒有更好的方式來做到這一點的設備的名稱? 我試過看BluetoothDevice的所有方法,但似乎沒有任何幫助 - 名稱真的是最好的方法嗎? 我看到有些地方的人說,我應該使用的UUID,但用來打開插座的設備,一旦我有它:

  _socket = myDevice.createRfcommSocketToServiceRecord(MY_UUID); 

有沒有更好的辦法做到這一點?

回答

0

您可以使用myDevice.getAddress()獲得藍牙設備地址和比較,它永遠是唯一的(不像名字)的同種/功能和/或品牌

+0

我試圖連接到一個特定類別的設備(讓我們說一個特定型號的jabra耳機),所以地址是事先不知道的。我在想像device.getBluetoothClass(),但我不知道它是如何工作的... – ekatz

+1

getBluetoothClass將爲您提供設備的類型和設備支持的服務類型。這對於進一步過濾到實物設備很有用。但最終要連接到你需要的設備,然後獲得它的藍牙地址並連接。 –

+0

請投票或接受答案,如果它有用 –

1

的設備通常都會有類似的名稱。例如,所有RN-41 devices from Roving Networks有以下名字:

FireFly-XXXX 

其中XXXX是設備的地址的最後4位數字。這意味着你可以使用下面的連接到其中任何

 if (device.getName().startsWith("FireFly-")) { 
      this.myDevice = device; 
      break; 
     } 

這正是我在我的應用程序做,並沒有發現任何更可靠/一致的方式來做到這一點。作爲概括,如果您感興趣的設備中的名稱比上述示例更復雜,則應該能夠使用常規模式。

+0

這就是我現在正在做的,但我希望有一個更好的方式,不依賴於名稱... – ekatz

0

您還可以使用BluetoothDevice.getBluetoothClass()來縮小哪些設備可能相關。

BluetoothClass.getMajorDeviceClass()會大致告訴你它是什麼類型的設備 - 電話,計算機,音頻或視頻設備,或其他。 BluetoothClass.hasService()進一步指定了設備的一些功能。

在每個主要類別中,定義了一些次要類別 - 它是什麼類型的計算機/音頻視頻設備/電話/健康設備等。

此外,在最新版本的Android平臺(API級別15+)上,您可以查詢設備的服務記錄,而無需連接到它。請參閱BluetoothDevice.fetchUuidsWithSdp()和BluetoothDevice.getUuids()。