2015-05-13 20 views
14

Ich versuche, Bluetooth-Statusänderungen mit Broadcast Receiver zu fangen.Android Broadcast Receiver Bluetooth Ereignisse fangen

Mein Manifest:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<application> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".BluetoothBroadcastReceiver" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> 
      <action android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" /> 
      <action android:name="android.bluetooth.device.action.ACL_CONNECTED" /> 
      <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /> 
     </intent-filter> 
    </receiver> 
</application> 

Empfänger onReceive Methode:

public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 
    Log.d("BroadcastActions", "Action "+action+"received"); 
    int state; 
    BluetoothDevice bluetoothDevice; 

    switch(action) 
    { 
     case BluetoothAdapter.ACTION_STATE_CHANGED: 
      state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); 
      if (state == BluetoothAdapter.STATE_OFF) 
      { 
       Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_SHORT).show(); 
       Log.d("BroadcastActions", "Bluetooth is off"); 
      } 
      else if (state == BluetoothAdapter.STATE_TURNING_OFF) 
      { 
       Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_SHORT).show(); 
       Log.d("BroadcastActions", "Bluetooth is turning off"); 
      } 
      else if(state == BluetoothAdapter.STATE_ON) 
      { 
       Log.d("BroadcastActions", "Bluetooth is on"); 
      } 
      break; 

     case BluetoothDevice.ACTION_ACL_CONNECTED: 
      bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Toast.makeText(context, "Connected to "+bluetoothDevice.getName(), 
        Toast.LENGTH_SHORT).show(); 
      Log.d("BroadcastActions", "Connected to "+bluetoothDevice.getName()); 
      break; 

     case BluetoothDevice.ACTION_ACL_DISCONNECTED: 
      bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Toast.makeText(context, "Disconnected from "+bluetoothDevice.getName(), 
        Toast.LENGTH_SHORT).show(); 
      break; 
    } 
} 

ich starte App minimiert es dann durch Home-Taste drücken. Gehe zu den Einstellungen und schalte Bluetooth ein, aber nichts passiert. Obwohl ich Toast und Logcat Nachrichten erwarte. Was ist hier falsch?

+0

Nicht sicher, kann es wegen der Art und Weise Broadcast registriert sein. Ich würde versuchen, im Dienst statt zur Laufzeit zu registrieren und sehen, ob sich das ändert. –

+0

@VladimirLichonos Ja, ich habe versucht, Dienst hinzuzufügen, wo ich Empfänger registrieren. Es sah wie folgt aus: IntentFilter vlnr = new IntentFilter (BluetoothDevice.ACTION_ACL_CONNECTED); fltr.addAction (BluetoothDevice.ACTION_ACL_DISCONNECTED); fltr.addAction (BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); fltr.addAction (BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver (brecv, vlnr); 'where' brecv' ist ein Objekt von CustomBluetoothReceiver. Es gab keine Änderungen. –

+0

Starten Sie den Service an einem Ort? – osayilgan

Antwort

35

Um Bluetooth Statusänderungen zu fangen (STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF), tun dies in Ihrer Aktivität:

Zuerst Bluetooth hinzufügen Erlaubnis Ihre AndroidManifest Datei:

<uses-permission android:name="android.permission.BLUETOOTH" /> 

erstellen BroadcastReceiver in Ihrer Aktivität oder Ihrem Service:

private final BroadcastReceiver mBroadcastReceiver1 = 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: 
        .. 
        break; 
       case BluetoothAdapter.STATE_TURNING_OFF: 
        .. 
        break; 
       case BluetoothAdapter.STATE_ON: 
        .. 
        break; 
       case BluetoothAdapter.STATE_TURNING_ON: 
        .. 
        break; 
      } 

     } 
    } 
}; 

Erstellen Sie einen IntentFilter an d es mit BroadcastReceiver registrieren zu Activity/Dienstleistung in Ihrer onCreate() Methode:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mBroadcastReceiver1, filter1); 

    ... 
} 

Unregister BroadcastReceiver in Ihrer onDestroy() Methode:

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

    unregisterReceiver(mBroadcastReceiver1); 
} 

Um Änderungen der Auffindbarkeit von Gerät zu fangen (SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE), erstellen Sie einen weiteren BroadcastReceiver und registrieren/entfernen Sie sich bei Ihrer Aktivität wie oben erwähnt. Nur der Unterschied zwischen diesen BroadcastReceivers ist der erste, der BluetoothAdapter.EXTRA_STATE verwendet und der andere BluetoothAdapter.EXTRA_SCAN_MODE. Hier ist der Beispielcode für BroadcastReceiver Auffindbarkeit Änderungen zu fangen:

Filter erstellen und registrieren Sie es in onCreate() Methode:

IntentFilter filter2 = new IntentFilter(); 
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
filter2.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); 
registerReceiver(mBroadcastReceiver2, filter2); 

Erstellen Sie die BroadcastReciver in Activity/Service-Auffindbarkeit Änderungen zu fangen:

private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() { 

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

     if(action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) { 

      int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR); 

      switch(mode){ 
       case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE: 
        .. 
        break; 
       case BluetoothAdapter.SCAN_MODE_CONNECTABLE: 
        .. 
        break; 
       case BluetoothAdapter.SCAN_MODE_NONE: 
        .. 
        break; 
      } 
     } 
    } 
}; 

Und schließlich Registrierung in onDestroy():

unregisterReceiver(mBroadcastReceiver2); 

Beachten Sie, dass Sie keine <intent-filter> oder <receiver> zu Ihrer AndroidManifest-Datei hinzufügen müssen, außer Sie müssen natürlich eine Bluetooth-Berechtigung hinzufügen.

Wenn Sie fangen wollen (ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECTED, ACTION_ACL_DISCONNECT_REQUESTED), jetzt müssen Sie einen <intent-filter> auf Ihre AndroidManifest Datei hinzuzufügen:

<intent-filter> 
    <action android:name="android.bluetooth.device.action.ACL_CONNECTED" /> 
    <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" /> 
</intent-filter> 

Filter erstellen und registrieren Sie es in onCreate() Methode:

IntentFilter filter3 = new IntentFilter(); 
filter3.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); 
filter3.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); 
registerReceiver(mBroadcastReceiver3, filter3); 

Dann erstellen Sie den BroadcastReceiver in Ihrer Aktivität/Service:

private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     switch (action){ 
      case BluetoothDevice.ACTION_ACL_CONNECTED: 
       .. 
       break; 
      case BluetoothDevice.ACTION_ACL_DISCONNECTED: 
       .. 
       break; 
     } 
    } 
}; 

Und schließlich deregistrieren:

unregisterReceiver(mBroadcastReceiver3); 

Wenn Sie mehr über Zustand Konstanten lesen, das ist aus der Dokumentation:

public static final String EXTRA_STATE:

als zusätzliches Feld int Verwendet in ACTION_STATE_CHANGED beabsichtigt, den aktuellen Betriebszustand anzufordern. Mögliche Werte sind: STATE_OFF, STATE_TURNING_ON, state_on, STATE_TURNING_OFF

public static final String EXTRA_SCAN_MODE:

als int zusätzliches Feld Verwendet in ACTION_SCAN_MODE_CHANGED Absichten zu Anforderung der aktuellen Scan-Modus. Mögliche Werte sind: SCAN_MODE_NONE, SCAN_MODE_CONNECTABLE, SCAN_MODE_CONNECTABLE_DISCOVERABLE

+1

Ich möchte Connect Disconnect Broadcasts in meiner Anwendung verwenden Ich habe denselben Code, aber ich registriere Broadcasts in Manifest selbst. Problem ist, dass ich nach dem Zufallsprinzip für zufällige Geräte Broadcast empfange .. Ich benutze Android M (6.0) Ich empfange Broadcast nur nach dem Pairing mit dem Gerät auch und manchmal ohne Pairing auch und auch wenn das Gerät nicht im Pairing-Modus ist dann auch. Kannst du Bitte hilf mir? – AdiAtAnd

+0

Hat sich in Oreo etwas verändert? Scheint nicht mehr zu zünden – behelit

+0

https://developer.android.com/guide/components/broadcasts.html#receiving_broadcasts: "Ab Android 8.0 (API-Stufe 26) sieht das System zusätzliche Einschränkungen für Manifest-deklarierte Empfänger vor Wenn Ihre App auf API-Ebene 26 oder höher abzielt, können Sie das Manifest nicht dazu verwenden, einen Empfänger für die meisten impliziten Broadcasts zu deklarieren (Broadcasts, die nicht speziell auf Ihre App ausgerichtet sind). " – xvlcw

0

Ihr Hauptproblem;) Du hast nicht "Schalter" für String-Vergleich verwenden können.

Zumindest nicht bis VERSION_INT 18 (inklusive). Version 19 begann mit Java 7.