2011-11-07 109 views
6

我有一个蓝牙设备与SPP配置文件和蓝牙2.1版。
我有一个应用程序连接到该设备,并与它通信。该设备使用“Just Works”配对技术。Android的蓝牙:配对的设备列表

我面临某些手机等三星Galaxy片剂的问题,银河学

的问题是从应用程序的用户退出后,我关闭插座和从该装置断开。成功断开连接后,观察到设备的条目已从配对设备列表中删除。

回答

13

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

这里的一般流程: 1)注册一个BroadcastReceiver来监听BluetoothDevice.ACTION_BOND_STATE_CHANGED
2)设备发现后,你应该有一个BluetoothDevice类对象。
3)使用反射来调用上的BluetoothDeviceObject
3A“createBond”方法)开口的插口

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

改变

里面一个BroadcastReciever:

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

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

+0

我应该在哪里查看这种临时配对行为的细节; Android文档或蓝牙2。1规格文件?如果是Android问题,则应在所有手机上重现。或者它与蓝牙堆栈上的制造商实施有关? – Ashwini

+0

制造商依赖于它提供的配对/绑定与临时连接的认证。通常配对的明确动作(这也意味着通过系统蓝牙 - 设置菜单保存配对设备) –

0

我也遇到了与索尼Xperia X10相同的问题。我设法通过改变蓝牙设备端的安全级别设置来“记住”配对(因为我正在开发该设备)。

我不确定“临时配对”的解释,这将是制造商的依赖,但没有多大意义,不同的手机会对与同一设备的连接做出不同的反应。

然而,这对我来说是一个无法解决的问题。通常,当用户在应用程序连接到后台时解除设备配对时,蓝牙堆栈似乎会崩溃。我仍然没有弄清楚如何正确管理ACTION_BOND_STATE_CHANGED事件。

+0

您能告诉我在配对设备列表中记住设备需要哪些安全等级设置?我可以很容易地在Android 3.0+的平板电脑上重现这一点,所以我认为它与Android版本有关。 – Ashwini

+0

当我从设备接收到声明I/O容量的请求时(它之前设置为“无输入,无输出”),我更改了设备固件以回复它为“仅显示”类型的设备。这种谈判是蓝牙配对协议的一部分,并在蓝牙规范中有记录,但我不知道为什么会影响手机的行为。 –