Android-Programmierung: Bluetooth
Willemers Informatik-Ecke
Sorry, noch Baustelle

Permissions im Manifest

In der Manifest-Datei muss die Erlaubnis eingetragen werden, dass Bluetooth verwendet wird.
<uses-permission
    android:name="android.permission.BLUETOOTH">
</uses-permission>
Damit Geräte gefunden und gepaart werden dürfen, muss folgende Erlaubnis eingetragen werden:
<uses-permission
    android:name="android.permission.BLUETOOTH_ADMIN">
</uses-permission>
Für die Ermittlung der Adressen verbundener Geräte muss folgende Permisson vorliegen:
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>

Zugriff auf den Adapter

Um über Bluetooth kommunizieren zu können, benötigt man erst einmal das Bluetooth-Device des eigenen Geräts, so es einen hat.
private BluetoothAdapter defBTAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        defBTAdapter = BluetoothAdapter.getDefaultAdapter();
Gibt es keinen Bluetooth-Adapter, ist der Rückgabewert null. Es kann aber auch sein, dass er nicht eingeschaltet ist. Das prüft man durch die Methode isEnabled. Letzteres kann man ändern, indem man die System-Activity ACTION_REQUEST_ENABLED aufruft.
      if (defBTAdapter != null && !defBTAdapter.isEnabled()) {
          Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
          activityResultLauncher.launch(intent);
      }
Der Start der Activity läuft im Hintergrund. Das Ergebnis wird in einem Callback erfahren.

In vielen Beispielen wird startActivityForResult verwendet. Diese Methode ist allerdings als deprecated gekennzeichnet und soll nicht mehr verwendet werden.

Statt startActivityForResult wird nun ein ActivityResultLauncher eingesetzt.

private ActivityResultLauncher activityResultLauncher =
        registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        TextView tv = (TextView) findViewById(R.id.tv);
                        if (result.getResultCode() == MainActivity.RESULT_OK) {
                            tv.setText("Alles gut");
                        } else {
                            tv.setText("Nicht gut");
                        }
                    }
                });

BluetoothDevice

Die Kommunikation geht über den eigenen BluetoothAdapter zu einem BluetoothDevice.

Die aktuell gekoppelten BluetoothDevices erhält man durch den Aufruf von getBondedDevices. Der folgende Programmausschnitt zeigt alle gekoppelten Geräte.

Set btDevices = defBTAdapter.getBondedDevices();
String str = "";
for (BluetoothDevice dev : btDevices) {
    str += "\n" + dev.getName();
}
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(str);

Übersicht

Ablauf

Server macht sich sichtbar und wartet auf Anfragen.

Der Client sucht ein Gerät, nimmt die Verbindung auf.

Der Server akzeptiert die Verbindung.

Der Client sendet seine Anfrage

Der Server sendet seine Antwort.

Der Client nimmt die Ergebnisse seiner Antwort entgegen.

Übersicht über die Klassen

Bluetooth im Emulator

Der Emulator bei Android-Studio beherrscht Bluetooth erst ab der API 30.

Links