2012-03-02 13 views
22

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(); 
} 

risposta

14

sto lavorando con androidi davvero incasinato bt per un bel po 'di tempo ,

ecco quello che posso dire:

ACTION_ACL_CONNECTED viene inviato ogni volta che è stata stabilita una connessione. Questo è semplice come si arriva.

Ora la parte piuttosto fastidioso.

ACTION_ACL_DISCONNECTED viene inviato ogni volta che la connessione è stata chiusa su un livello hardware. QUANDO ciò accade è un po 'all'altezza del dispositivo stesso. se si scollega manualmente/collegare l'altro dispositivo, in qualche modo non invia un "tizio im andato" segnale al droide, invece, dopo un massimo di 20 secondi alcuni latrati di cane da guardia e la connessione viene chiusa e l'intento è inviato.

Ora ho provato questo solo con i dispositivi SPP che mi collego al. Un auricolare afaik si collega attivamente da solo perché non è SPP. Quindi si connette automaticamente a te, se sei abbinato e in modalità ascolto. Ora non so cosa fa l'auricolare se lo "spegni". Forse si disconnette correttamente o forse interrompe la connessione senza salutare. In quest'ultimo caso ci sarebbe voluto del tempo per il cane da guardia di disconnettersi dal lato droide, che può richiedere da 0 a 20 secondi, mi non chiedere perché, è solo la mia osservazione.

+0

agrre con voi. Dopo la connessione potrebbe essere 10 secondi, viene interrotta la trasmissione di diconnect –

Problemi correlati