Ash*_*kar 6 android bluetooth android-bluetooth
我有一个带SPP配置文件和蓝牙版本2.1的蓝牙设备.
我有一个连接到该设备并与之通信的应用程序.该设备使用"Just Works"配对技术.
我在某些手机上遇到问题,如三星Galaxy平板电脑,Galaxy S.
问题是在用户退出应用程序后,我正在关闭套接字并断开与设备的连接.成功断开连接后,会发现设备的条目已从配对设备列表中删除.
小智 13
我没有使用平板电脑,但我确实编写了一个使用SPP for Android手机的应用程序.我发现,为了使蓝牙稳定,我必须手动绑定我想要与之通信的设备.我们使用下面的代码从应用程序中启动绑定,它应该保留绑定,就像您通过设置菜单手动配对一样.
以下是一般流程: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();
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
5)打开插座并进行通信
你也可以通过反射'removeBond'方法从配对列表中删除你的设备.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
11480 次 |
| 最近记录: |