Android蓝牙:配对设备列表

Android蓝牙:配对设备列表,android,bluetooth,android-bluetooth,Android,Bluetooth,Android Bluetooth,我有一个带有SPP配置文件和蓝牙版本2.1的蓝牙设备。 我有一个应用程序可以连接到该设备并与之通信。该设备使用“只工作”配对技术 我在三星Galaxy平板电脑Galaxy S等手机上遇到了问题 问题是在用户退出应用程序后,我正在关闭插座并断开与设备的连接。成功断开连接后,观察到设备条目已从配对设备列表中删除

我有一个带有SPP配置文件和蓝牙版本2.1的蓝牙设备。
我有一个应用程序可以连接到该设备并与之通信。该设备使用“只工作”配对技术

我在三星Galaxy平板电脑Galaxy S等手机上遇到了问题


问题是在用户退出应用程序后,我正在关闭插座并断开与设备的连接。成功断开连接后,观察到设备条目已从配对设备列表中删除要将设备保留在配对列表中,您应通过蓝牙设置菜单手动配对。配对后,您的程序可以连接/断开连接,设备将保留在配对列表中

我没有使用过平板电脑,但我确实编写了一个应用程序,在Android手机上使用SPP。我发现,为了让蓝牙稳定,我必须手动连接我想与之通信的设备。我们使用下面的代码从应用程序内部启动绑定,它应该保持绑定,就像您通过设置菜单手动配对一样

以下是一般流程: 1) 注册广播接收器以侦听Bluetooth设备。操作\u绑定\u状态\u已更改
2) 设备发现后,您应该有一个BluetoothDevice对象。
3) 使用反射在BluetoothDeviceObject上调用“createBond”方法
3a)在打开插座之前,等待键状态变化事件

BluetoothDevice device = {obtained from device discovery};
Method m = device.getClass().getMethod("createBond", (Class[])null);
m.invoke(device, (Object[])null);

int bondState = device.getBondState();
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING)
{
    waitingForBonding = true; // Class variable used later in the broadcast receiver

    // Also...I have the whole bluetooth session running on a thread.  This was a key point for me.  If the bond state is not BOND_BONDED, I wait here.  Then see the snippets below
    synchronized(this)
    {
        wait();
    }
}
4) 等待键合状态从键合变为键合

在广播接收器内:

public void onReceive(Context context, Intent intent)
{
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))
    {
        int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);
        int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);

        if (waitingForBonding)
        {
            if (prevBondState == BluetoothDevice.BOND_BONDING)
            {
                // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully.
                if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE)
                {
                    // safely notify your thread to continue
                }
            }
        }
    }
}
5) 打开套接字并进行通信

您还可以通过反射使用“removeBond”方法将设备从配对列表中删除


希望这有帮助

我在索尼Xperia X10上也遇到了同样的问题。通过更改蓝牙设备端的安全级别设置,我成功地“记住”了配对(我也在开发该设备)

我不确定“临时配对”的解释是什么,这取决于制造商,不同的手机对同一设备的连接会有不同的反应,这没有多大意义


然而,对我来说,这是一个问题。通常,当用户在后台连接应用程序时,解除配对设备时,蓝牙堆栈似乎会崩溃。我仍然没有弄清楚如何正确地管理动作、状态和更改事件

我应该在哪里了解这种临时配对行为的细节;Android文档还是蓝牙2.1规范文档?如果是Android问题,则应可在所有手机上复制。或者它与制造商在蓝牙协议栈上的实现有关?这取决于制造商提供的配对/绑定选项,而不仅仅是对临时连接进行身份验证。典型的明确配对操作(这也意味着通过系统蓝牙-设置菜单保存配对设备)您能告诉我需要哪些安全级别设置来记住配对设备列表中的设备吗?我可以在安卓3.0+平板电脑上轻松重现这一点,因此我认为它与安卓版本有关。我更改了设备固件,以答复当它收到手机请求声明其I/O容量时,它是“仅显示”类型的设备(之前它被设置为“无输入无输出”)。这个协商是蓝牙配对协议的一部分,在蓝牙规范中有记录,但我不知道为什么它会影响手机的行为。