Android 我如何实际绑定设备?

Android 我如何实际绑定设备?,android,bluetooth,device,Android,Bluetooth,Device,我到处都能找到蓝牙适配器的“getBondedDevices()”方法。然而,我旁边有我的平板电脑和另一个蓝牙设备,我不知道如何让该设备显示在绑定设备列表中 在蓝牙术语中,“绑定”和“配对”基本上是同义词(官方上,配对过程会导致绑定,但大多数人使用它们是可互换的)。为了将您的设备添加到该列表中,您必须经历查找过程,这是一个设备搜索和查找另一个设备的过程,然后将这两个设备配对 实际上,您可以作为用户从设备设置中执行此操作,但如果您在应用程序的上下文中这样做,则您的过程可能如下所示: 为Blueto

我到处都能找到蓝牙适配器的“getBondedDevices()”方法。然而,我旁边有我的平板电脑和另一个蓝牙设备,我不知道如何让该设备显示在绑定设备列表中

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

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

  • Bluetooth设备注册
    BroadcastReceiver
    。找到操作
    Bluetooth适配器。操作\u发现\u已完成
  • 通过调用
    BluetoothAdapter.startDiscovery()
  • 每次在范围内发现新设备时,您的接收器都会被第一个动作调用,您可以检查它以确定它是否是您要连接的设备。您可以调用
    BluetoothAdapter.cancelDiscovery()
    ,一旦您发现它不会过度浪费电池
  • 当发现完成时,如果您没有取消它,您的接收者将被第二个操作调用;所以你知道不要期待更多的设备
  • 手持设备实例,打开
    BluetoothSocket
    connect()
    。如果设备尚未绑定,这将启动配对,并可能显示PIN码的某些系统UI
  • 配对后,您的设备将显示在“绑定设备”列表中,直到用户进入“设置”并将其删除
  • connect()
    方法实际上也会打开套接字链接,当它返回而不引发异常时,两个设备就连接起来了
  • 现在已连接,您可以从套接字调用
    getInputStream()
    getOutputStream()
    ,以读取和写入数据
  • 基本上,您可以检查绑定设备的列表以快速访问外部设备,但在大多数应用程序中,您将同时执行此操作和真正的发现,以确保无论用户做什么,都可以始终连接到远程设备。如果一个设备已经绑定,您只需执行步骤5-7来连接和通信

    有关更多信息和示例代码,请查看的“查找设备”和“连接设备”部分


    HTH

    API级别19及以上,您可以在要连接的蓝牙设备Instance上调用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"/>
    

    只需在所选设备上调用createBond()。

    非常感谢您的帮助。但我目前仍停留在第5步。在我的onReceive方法中,我将找到的设备添加到一个列表中,但这就是我所能得到的。我正在寻找BluetoothSocket构造函数上的文档,但尚未找到任何文档。我是否只需创建一个对象,调用其上的“connect()”函数,然后这些设备就会出现在我的绑定设备列表中?找到的设备位于ArrayAdapter数据结构中,我很难理解在新对象上调用connect()会为我做任何事情。如果您阅读了我链接到的开发指南,您会在连接示例中注意到方法
    createrFComSocketToServiceRecord()
    用于从设备上生成套接字对象。是的,对不起,我已经阅读了指南,但还是有点困惑。我正在使用手机/平板电脑连接到另一个不是手机/平板电脑的蓝牙设备。这可能看起来很琐碎,但我无法说服自己我理解它,当我向我的对象添加BluetoothSocket时,我的手机/平板电脑充当服务器,对吗?我也对它说调用“connect()”开始监听设备感到困惑,但我已经找到了设备并有了它的地址。它到底在监听什么?这取决于嵌入式设备的设置方式,但大多数嵌入式蓝牙调制解调器默认接受传入连接(使其成为服务器)。Android设备将是一个客户端,调用
    connect()
    ,如指南中的“作为客户端连接”示例所示。当
    connect()
    成功返回时,您可以使用
    getInputStream()
    getOutputStream()
    开始传输数据。您可以从
    getBondedDevices()
    获得
    Bluetooth设备或者在发现该设备时,在发现过程中通过
    广播接收器
    回调。在后一种情况下,设备本身在
    Intent
    中作为额外信息传递回
    onReceive()
    方法。
    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);
                }
            }
    };