Non ho lavorato con i tablet, ma ho scritto un'app che utilizzava SPP per i telefoni Android. Quello che ho scoperto è che per ottenere la stabilità del Bluetooth, devo legarmi manualmente con il dispositivo con cui voglio comunicare. Abbiamo usato il codice qui sotto per iniziare il legame dall'interno dell'app e dovrebbe preservare il legame come se fosse stato abbinato manualmente al menu delle impostazioni.
Ecco il flusso generale: 1) Registra un BroadcastReceiver per ascoltare BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) Dopo la scoperta dispositivo che si dovrebbe avere un oggetto BluetoothDevice.
3) Uso riflessione di chiamare il metodo 'createBond' su un BluetoothDeviceObject
3a) Attendere eventi di modifica dello stato legame prima prese apertura
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) Attendere lo stato legame per passare da BOND_BONDING a BOND_BONDED
All'interno di un 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) socket aperti e comunicare
È anche possibile il metodo 'removeBond' tramite riflessione per rimuovere il dispositivo dall'elenco di pairing.
Spero che questo aiuti!
Dove devo esaminare i dettagli per questo comportamento di accoppiamento temporaneo; Documentazione Android o bluetooth 2.1 documenti di specifica? Se si tratta di un problema Android, deve essere riproducibile su tutti i telefoni. O è legato all'implementazione del produttore sullo stack bluetooth? – Ashwini
È il produttore che dipende dall'opzione che fornisce per accoppiare/legare vs solo autenticare per la connessione temporanea. Azione tipicamente esplicita per l'accoppiamento (che implica anche il salvataggio del dispositivo accoppiato tramite il sistema bluetooth - menu impostazioni) –