Mi piacerebbe sapere quali eventi nei dispositivi fisici remoti attivano ACTION_ACL_CONNECTED e ACTION_ACL_DISCONNECTED in un dispositivo di ascolto. I risultati del mio test non hanno senso. Ho raccolto diversi dispositivi entro pochi decimetro di ogni altro:Cosa attiva le trasmissioni BluetoothDevice.ACTION_ACL?
un Galaxy Tab P7500 con sistema operativo Android 3.1
un telefono i5500 con sistema operativo Android 2.2
un winXP PC con un dongle Bluetooth USB
due cuffie con pulsanti on/off
Innanzitutto, accoppiare manualmente tutti i dispositivi dalla scheda. Né il PC né il telefono sono accoppiati con nessun altro dispositivo, ma la scheda. (Uno degli auricolari non può mai essere trovato dalla scheda in alcun modo, ma può essere facilmente trovato dal telefono sia manualmente che a livello di programmazione). Poi ho una semplice app per iniziare la scoperta e che ascolta e visualizza le trasmissioni ACL. E questo è ciò che accade (stessa cosa ogni volta, la sua coerente nella sua follia):
- startDiscovery() dalla Tab con tutti i dispositivi abilitati: - Il PC è l'unico dispositivo trovato
- disattivare il Bluetooth sul PC: - Nessuna reazione sulla scheda
Attiva Bluetooth su PC: - Nessuna reazione sul Power Tab
auricolare 1 ° tempo: - ACTION_ACL_CONNECTED nella scheda
- Spegnimento auricolare: - Nessuna reazione o n il Power Tab
auricolare di nuovo: - ACTION_ACL_DISCONNECTED e ACTION_ACL_CONNECTED in rapida successione sulla scheda
disattivare il Bluetooth sul Tab: - Nessuna reazione sulla scheda
Attiva Bluetooth on Tab: - Auricolare ACTION_ACL_CONNECTED sulla scheda
startDiscovery() dal telefono: - il PC è l'unico dispositivo trovato dal telefono , anche se il telefono è abbinato soltanto con la scheda, non con la PC. In caso contrario, il telefono reagisce solo alle cuffie che non rispondono alla scheda .
Cosa fare di questo pasticcio? Non è possibile fare affidamento su un dispositivo che causa ACTION_ACL_CONNECT anche se è accoppiato e si accende nel raggio d'azione?
Questi sono i metodi per BroadcastReceiver e le attività onCreate, ma non mi aspetto particolari in questo codice alla materia:
BroadcastReceiver intentReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device != null) {
name = device.getName();
Log.v(TAG, "Device=" + device.getName());
}
else {
name = "None";
}
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
text1.setText(name + " connected " + (checkCounter++));
Log.v(TAG, "connected: " + device);
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
text2.setText(name + " disconnected " + (checkCounter++));
Log.v(TAG, "disconnected: " + device);
}
else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
text3.setText(name + " found " + (checkCounter++));
Log.v(TAG, "found: " + device + "");
}
else if (blueAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
text4.setText("Started " + (checkCounter++));
Log.v(TAG, "Discovery started");
}
else if (blueAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
text4.setText("Finished " + (checkCounter++));
Log.v(TAG, "Discovery finished");
}
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bluetoothlayout);
text1 = (TextView)findViewById(R.id.textView1);
text2 = (TextView)findViewById(R.id.textView2);
text3 = (TextView)findViewById(R.id.textView3);
text4 = (TextView)findViewById(R.id.textView4);
BluetoothDevice mw600 = blueAdapter.getRemoteDevice("58:17:0C:EB:C5:08");
BluetoothDevice bt500 = blueAdapter.getRemoteDevice("00:1D:43:00:C4:54");
BluetoothDevice galaxyTab = blueAdapter.getRemoteDevice("00:07:AB:6A:96:7D");
BluetoothDevice pcDongle = blueAdapter.getRemoteDevice("00:15:83:4D:8B:57");
intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_STARTED);
intentFilter.addAction(blueAdapter.ACTION_DISCOVERY_FINISHED);
if (!isReceiverRegistered) {
registerReceiver(intentReceiver, intentFilter);
isReceiverRegistered = true;
}
if (!blueAdapter.isEnabled()) {
blueAdapter.enable();
}
blueAdapter.startDiscovery();
}
agrre con voi. Dopo la connessione potrebbe essere 10 secondi, viene interrotta la trasmissione di diconnect –