【问题标题】:How do I actually BOND a device?我如何实际绑定设备?
【发布时间】:2012-06-11 20:04:42
【问题描述】:

我在任何地方都可以找到适用于我的蓝牙适配器的“getBondedDevices()”方法。但是,我有我的平板电脑和另一个蓝牙设备坐在我旁边,我不知道如何实际让设备显示在绑定设备列表中。

【问题讨论】:

    标签: android bluetooth device


    【解决方案1】:

    在蓝牙术语中,“bonded”和“paired”基本上是同义词(官方说,配对过程会产生bond,但大多数人可以互换使用它们)。为了将您的设备添加到该列表中,您必须完成 发现 过程,即一台设备如何搜索并找到另一台设备,然后将两者配对在一起。

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

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

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

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

    HTH

    【讨论】:

    • 非常感谢您的帮助。我目前被困在第 5 步。在我的 onReceive 方法中,我将找到的设备添加到列表中,但就我所知。我正在寻找有关 BluetoothSocket 构造函数的文档,但尚未找到任何文档。我是否只是创建一个对象,在其上调用“connect()”函数,然后设备将出现在我的绑定设备列表中?找到的设备位于 ArrayAdapter 数据结构中,我无法理解在新对象上调用 connect() 将为我做所有事情的想法。
    • 如果您阅读我链接的开发指南,您会注意到在连接示例中createRfcommSocketToServiceRecord() 方法用于从设备生成套接字对象。
    • 是的,抱歉,我已经浏览了指南,但我还是有点困惑。我正在使用手机/平板电脑连接到另一个不是手机/平板电脑的蓝牙设备。这可能看起来微不足道,但我无法说服自己理解它,当我将 BluetoothSocket 添加到我的对象时,我的手机/平板电脑充当服务器,对吗?我也很困惑它说调用'connect()'开始监听设备,但我已经找到了设备并有了它的地址。它到底会听什么?
    • 这在一定程度上取决于您的嵌入式设备的设置方式,但大多数嵌入式蓝牙调制解调器默认接受传入连接(使它们成为服务器)。 Android 设备将是一个客户端,调用connect(),如指南的“作为客户端连接”示例中所示。当connect()成功返回时,您可以使用getInputStream()getOutputStream()开始传输数据。
    • 您可以在发现设备时从getBondedDevices()(如果已经配对)或BroadcastReceiver 回调中获得BluetoothDevice。在后一种情况下,设备本身作为 Intent 中的额外内容传递回 onReceive() 方法。
    【解决方案2】:

    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()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多