14

在我所见的任何地方,我都为我的蓝牙适配器找到了这种方法“getBondedDevices()”。但是,我有我的平板电脑和另一个蓝牙设备坐在我旁边,我不知道如何真正让设备显示在绑定设备列表中。

4

2 回答 2

27

在蓝牙术语中,“绑定”和“配对”基本上是同义词(官方称,配对过程会导致绑定,但大多数人可以互换使用它们)。为了将您的设备添加到该列表中,您必须完成Discovery过程,这是一个设备搜索和找到另一个设备的方式,然后将两者配对。

您实际上可以作为用户从设备设置中执行此操作,但如果您希望在应用程序的上下文中这样做,您的过程可能看起来像这样:

  1. 注册一个BroadcastReceiverforBluetoothDevice.ACTION_FOUNDBluetoothAdapter. ACTION_DISCOVERY_FINISHED
  2. 通过调用开始发现BluetoothAdapter.startDiscovery()
  3. 每次在范围内发现新设备时,您的接收器都会通过第一个操作被调用,您可以检查它以查看它是否是您想要连接的设备。BluetoothAdapter.cancelDiscovery()一旦你发现它不会浪费不必要的电池,你就可以打电话。
  4. 发现完成后,如果您没有取消它,您的接收器将通过第二个操作被调用;所以你知道不要期待更多的设备。
  5. 手持设备实例,打开一个BluetoothSocketconnect()。如果设备尚未绑定,这将启动配对并可能会显示一些系统 UI 以获取 PIN 码。
  6. 配对后,您的设备将显示在绑定的设备列表中,直到用户进入设置并将其删除。
  7. connect()方法实际上还打开了套接字链接,当它返回而没有抛出异常时,两个设备已连接。
  8. 现在连接好了,就可以调用getInputStream()getOutputStream()从socket中读写数据了。

基本上,您可以检查绑定设备列表以快速访问外部设备,但在大多数应用程序中,您将结合使用此功能和真正的发现,以确保无论用户如何,您都可以始终连接到远程设备做。如果设备已经绑定,您只需执行步骤 5-7 即可连接和通信。

有关更多信息和示例代码,请查看Android SDK 蓝牙指南的“发现设备”和“连接设备”部分。

高温高压

于 2012-06-07T19:00:37.703 回答
3

API 级别 19 及以上您可以在要连接的 BluetoothDevice 实例上调用 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()。

于 2017-09-22T06:13:50.577 回答