我有一个具有 SPP 配置文件和蓝牙版本 2.1 的蓝牙设备。
我有一个连接到该设备并与之通信的应用程序。该设备使用“Just Works”配对技术。
我在某些手机上遇到问题,例如三星 Galaxy 平板电脑、Galaxy S。
问题是用户退出应用程序后,我正在关闭套接字并与设备断开连接。成功断开连接后,可以观察到该设备的条目已从配对设备列表中删除。
我有一个具有 SPP 配置文件和蓝牙版本 2.1 的蓝牙设备。
我有一个连接到该设备并与之通信的应用程序。该设备使用“Just Works”配对技术。
我在某些手机上遇到问题,例如三星 Galaxy 平板电脑、Galaxy S。
问题是用户退出应用程序后,我正在关闭套接字并与设备断开连接。成功断开连接后,可以观察到该设备的条目已从配对设备列表中删除。
我没有使用过平板电脑,但我确实为 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
在广播接收器内部:
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”方法从配对列表中删除您的设备。
希望这可以帮助!
如果配对是由于您的应用程序连接而发生的,我猜测某些设备会将其视为临时配对,并且在连接断开后不会将设备保留在配对列表中。要将设备保留在配对列表中,您应该通过蓝牙设置菜单手动配对。配对后,您的程序可以连接/断开连接,并且设备将保留在配对列表中。
我在使用 Sony Xperia X10 时也遇到了同样的问题。我设法通过更改蓝牙设备端的安全级别设置使其“记住”配对(因为我也在开发设备)。
我不确定“临时配对”的解释,这将取决于制造商,不同的手机会对与同一设备的连接做出不同的反应并没有多大意义。
然而,这对我来说是个问题。通常,当用户在后台连接应用程序时取消配对设备时,蓝牙堆栈似乎会崩溃。我还没有弄清楚如何正确管理 ACTION_BOND_STATE_CHANGED 事件。