2012-06-07 53 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()。

相关问题