2011-07-06 95 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()。