安卓蓝牙:已配对设备列表

6
我有一个蓝牙设备,支持SPP配置文件和蓝牙版本2.1。 我有一个应用程序连接到该设备并与其通讯。该设备使用“只需操作”配对技术。
我遇到了一些问题,比如三星Galaxy平板电脑和Galaxy S手机等某些手机上。 问题在于用户退出应用程序后,我关闭了套接字并断开了设备的连接。成功断开连接后,观察到设备的条目已从配对设备列表中删除。
3个回答

13

我没有使用过平板电脑,但我写过一个应用程序,用于Android手机使用SPP。我发现为了使蓝牙稳定,我必须手动绑定我想要通信的设备。我们在应用程序中使用下面的代码来启动绑定过程,它应该会像你通过设置菜单手动配对设备一样保留绑定信息。

以下是一般流程: 1)注册BroadcastReceiver以侦听BluetoothDevice.ACTION_BOND_STATE_CHANGED 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) 等待绑定状态从BOND_BONDING变为BOND_BONDED

在BroadcastReceiver内部:

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”方法将设备从配对列表中删除。

希望这可以帮助你!


0

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

我不确定“临时配对”的解释,这可能取决于制造商,不太合理的是不同的手机会对与同一设备的连接有不同的反应。

然而,对我来说,解除绑定的部分是一个问题。通常情况下,当用户在后台连接应用程序时取消配对设备时,蓝牙堆栈似乎会崩溃。我仍然没有弄清楚如何正确地处理ACTION_BOND_STATE_CHANGED事件。


你能告诉我在配对设备列表中需要哪些安全级别设置才能记住设备吗?我可以在安卓3.0及以上版本的平板电脑上轻松重现这个问题,因此我认为这与安卓版本有关。 - Ashwini Shahapurkar
我已将设备固件更改为在接收到手机的I/O能力声明请求时回复它是“仅显示”类型的设备(之前设置为“无输入和无输出”)。这种协商是蓝牙配对协议的一部分,并在蓝牙规范中有记录,但我不知道为什么它会影响手机的行为。 - Pierre Bureau

0
如果配对是由于您的应用程序连接而发生的,我猜想一些设备会将其视为临时配对,并在连接断开后不会将设备保留在配对列表中。 要将设备保留在配对列表中,您应该通过蓝牙设置菜单手动进行配对。一旦配对成功,您的程序可以连接/断开连接,设备将保留在配对列表中。

我应该在哪里查看有关这种临时配对行为的详细信息?是在Android文档还是蓝牙2.1规范文档中?如果这是一个Android问题,它应该在所有手机上都可以重现。或者这是否与制造商在蓝牙堆栈上的实现有关? - Ashwini Shahapurkar
这取决于制造商提供的选项,是配对/绑定还是仅进行临时连接的身份验证。通常,配对的显式操作(也意味着保存已配对设备)是通过系统蓝牙设置菜单完成的。 - Dennis Mathews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接