Я не работал с планшетами, но я написал приложение, которое использовало SPP для телефонов Android. Я обнаружил, что для обеспечения стабильности Bluetooth я должен вручную связаться с устройством, с которым я хочу общаться. Мы использовали приведенный ниже код, чтобы инициировать связывание из приложения, и оно должно сохранить связывание так же, как если бы вы вручную подключались через меню настроек.
Вот общий поток:
1) Зарегистрируйте BroadcastReceiver для прослушивания BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) После обнаружения устройства у вас должен быть объект BluetoothDevice.
3) Используйте отражение для вызова метода createBond для BluetoothDeviceObject
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
Внутри 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 с помощью отражения, чтобы удалить ваше устройство из списка сопряжения.
Надеюсь, это поможет!