2012-03-13 20 views
52

Mam aplikację z przyciskiem, której używam do włączania i wyłączania BT. Mam tam następujący kod;Wykrywanie zmian stanu dokonanych w adapterze Bluetooth?

public void buttonFlip(View view) { 
    flipBT(); 
    buttonText(view); 
} 

public void buttonText(View view) { 
    Button buttonText = (Button) findViewById(R.id.button1); 
    if (mBluetoothAdapter.isEnabled() || (mBluetoothAdapter.a)) { 
     buttonText.setText(R.string.bluetooth_on); 
    } else { 
     buttonText.setText(R.string.bluetooth_off); 
    } 
} 

private void flipBT() { 
    if (mBluetoothAdapter.isEnabled()) { 
     mBluetoothAdapter.disable();  
    } else { 
     mBluetoothAdapter.enable(); 
    } 
} 

Dzwonię przycisk Flip, który odwraca stan BT, a następnie wywołuje ButtonText, który powinien zaktualizować interfejs użytkownika. Jednak problem, który mam, trwa kilka sekund, zanim BT się włączy - i przez te sekundy stan BT nie jest włączony, co powoduje, że mój przycisk mówi, że Bluetooth jest wyłączony, nawet jeśli zostanie włączony w ciągu 2 sekund.

Znalazłem stałą STATE_CONNECTING w dokumentacji Android BluetoothAdapter, ale ... Po prostu nie wiem jak z niej korzystać, będąc początkującym i wszystkim.

Tak, mam dwa pytania:

  1. Czy istnieje sposób dynamicznie powiązać element UI (takie jak przycisk lub obrazek) do stanu BT, tak, że kiedy zmienia się stan BT, przycisk również się zmieni?
  2. W przeciwnym razie chciałbym nacisnąć przycisk i uzyskać poprawny stan (chciałbym, aby BT powiedziało, nawet jeśli jest to tylko połączenie, ponieważ będzie włączone za 2 sekundy). Jak mam to zrobic?
+0

nie można użyć logiczną i ustawić go na true raz BT zaczyna włączeniu, a następnie sprawdzić stan logiczny, aby zmienić przycisk? –

+0

Zobacz kod AOSP, aby dowiedzieć się, jak śledzą zmiany włączania i wyłączania bluetooth: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

Odpowiedz

149

Będziemy chcieli, aby zarejestrować BroadcastReceiver nasłuchiwać wszelkich zmianach stanu BluetoothAdapter:

jako zmiennej instancji prywatnych w twojej Activity (lub w osobnym pliku klasy ... Niezależnie od tego, którą wolisz):

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 
               BluetoothAdapter.ERROR); 
      switch (state) { 
      case BluetoothAdapter.STATE_OFF: 
       setButtonText("Bluetooth off"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_OFF: 
       setButtonText("Turning Bluetooth off..."); 
       break; 
      case BluetoothAdapter.STATE_ON: 
       setButtonText("Bluetooth on"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_ON: 
       setButtonText("Turning Bluetooth on..."); 
       break; 
      } 
     } 
    } 
}; 

pamiętać, że ta zakłada, że ​​Activity implementuje metodę setButtonText(String text) która zmieni tekst Button „s odpowiednio.

A potem w swojej Activity, zarejestrować i wyrejestrować BroadcastReceiver następująco,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* ... */ 

    // Register for broadcasts on BluetoothAdapter state change 
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mReceiver, filter); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    /* ... */ 

    // Unregister broadcast listeners 
    unregisterReceiver(mReceiver); 
} 
+0

Alex, to prawie działa. Kilka rzeczy. po pierwsze, myślę, że chciałeś zarejestrować BluetoothAdapter, a nie BluetoothDevice, ponieważ BluetoothDevice jest po sparowaniu urządzenia i ma tylko BluetoothDevice.ACTION_BOND_STATE_CHANGED, co nie ma tutaj zastosowania. Dodałem także; po nadaniu koduReceiver (piszę to tylko dla przyszłych ludzi, którzy będą mieli ten sam problem i przeczytam to), jednak otrzymuję "Java.lang.RuntimeException: Nie można utworzyć wystąpienia ComponentInfo", co zwykle oznacza moja działalność nie jest zarejestrowana w manifeście - czy muszę zarejestrować tam odbiorcę? – raingod

+0

ha! Jestem idiotą :) Rozgryzłem mój problem. więc, tak, poza kodem, o którym wspomniałem, to działa pięknie :) dzięki Alex! – raingod

+0

nie ma problemu! Przepraszam za literówki ... kiedy to pisałem, wiedziałem, że musi być para :). –

Powiązane problemy