2012-03-02 9 views
22

Chciałbym wiedzieć, jakie zdarzenia w zdalnych urządzeniach fizycznych wyzwalają ACTION_ACL_CONNECTED i ACTION_ACL_DISCONNECTED w urządzeniu podsłuchowym. Moje wyniki testu nie mają sensu. I zebrali kilka urządzeń w ciągu kilku decymetr wzajemnie:Co uruchamia transmisje BluetoothDevice.ACTION_ACL?

Galaxy Tab P7500 z systemem Android 3.1

telefonu I5500 z systemem Android 2.2

winXP PC z kluczem USB Bluetooth

dwa zestawy słuchawkowe z przyciskami włączania/wyłączania

Najpierw paruję ręcznie ze wszystkimi urządzeniami z karty. Ani komputer, ani telefon nie są sparowane z żadnym innym urządzeniem oprócz Tab. (Jeden zestaw słuchawkowy nigdy nie zostanie znaleziony przez kartę, ale można go łatwo znaleźć z telefonu zarówno ręcznie, jak i programowo). Następnie mam prostą aplikację do uruchamiania wykrywania, która słucha i wyświetla transmisje ACL. A to, co się dzieje (to samo za każdym razem jego konsekwentne w swoim szaleństwie):

  • startDiscovery() na karcie po włączeniu wszystkich urządzeń: - Komputer PC jest jedynym urządzeniem znaleźć
  • Wyłącz Bluetooth na PC: - Brak reakcji na karcie
  • Włącz bluetooth na PC: - brak reakcji na karcie

  • Moc zestawu słuchawkowego 1 raz: - ACTION_ACL_CONNECTED na karcie

  • Mocy off Stery: - Nie o reakcję n Tab
  • Moc zestawu słuchawkowego znowu: - ACTION_ACL_DISCONNECTED i ACTION_ACL_CONNECTED w krótkim odstępie czasu na karcie

  • wyłączyć Bluetooth w zakładce: - Brak reakcji na karcie

  • Włącz Bluetooth w zakładce - Słuchawki ACTION_ACL_CONNECTED na karcie

  • startDiscovery() z telefonem: - PC jest jedynym urządzeniem znaleziony przez telefon , mimo że telefon jest powiązany tylko z uchwyt, a nie z komputerów. W przeciwnym razie telefon reaguje tylko na zestaw słuchawkowy, na który karta nie reaguje.

Co zrobić z tym bałaganem? Czy nie można polegać na urządzeniu powodującym ACTION_ACL_CONNECT, nawet gdy jest ono sparowane i zasila się w zasięgu?

Oto sposoby BroadcastReceiver i działalności onCreate, ale nie spodziewam się szczegółów na temat kodu znaczenia:

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

Odpowiedz

14

pracuję z androidy naprawdę zawiedli bt od dłuższego czasu ,

tutaj jest to, co mogę wam powiedzieć:

ACTION_ACL_CONNECTED jest wysyłany, gdy udane połączenie zostało ustanowione. Ten jest tak prosty, jak to tylko możliwe.

Teraz dość denerwująca część.

ACTION_ACL_DISCONNECTED jest wysyłana, gdy połączenie zostało zamknięte na poziomie HARDWARE. KIEDY to się dzieje, zależy od samego urządzenia. JEŚLI ręcznie odłączysz/odłączysz drugie urządzenie, to w jakiś sposób nie wyśle ​​ono do droida sygnału "dude, im gone", zamiast tego po 20 sekundach jakiś watchdog szczeka i połączenie jest zamykane, a intencja zostaje wysłana.

Teraz próbowałem tego tylko z urządzeniami SPP, z którymi się łączyłem. Zestaw słuchawkowy Afaik łączy się samoczynnie, ponieważ nie jest to SPP. Dlatego automatycznie łączy się z Tobą, jeśli jesteś w parze iw trybie słuchania. Teraz nie wiem, co robi zestaw słuchawkowy, jeśli go "wyłączysz". Może to się rozłącza, a może po prostu zakłóca połączenie bez pożegnania. W tym drugim przypadku watchdog musiałby odłączyć się od strony robotów, co może zająć od 0 do 20 sekund, nie pytaj mnie dlaczego, to tylko moja obserwacja.

+0

agrre z tobą. Po może być 10 sekund połączenie, diconnect transmisja jest recived –

Powiązane problemy