Bluetooth Pairing, ohne die App zu verlassen

Wird eine Android App entwickelt, die mit einem externen Peripherie Gerät kommuniziert, wird für die Schnittstelle oft Bluetooth gewählt. Die Technik ist sehr ausgereift, energiesparend, sicher, schnell und bietet noch eine ganze Reihe weiterer Vorteile. Ein großer Nachteil, den man in vielen Apps mit Bluetooth sieht, ist, dass die Entwickler es unterlassen haben das Pairing aus der App heraus umzusetzen.

Um ein Bluetooth Gerät mit dem Android Gerät zu verbinden muss der Anwender dann oft in den Einstellungen kompliziert die Pairing Prozedur durchführen, bevor es möglich ist, sich aus der App mit dem Bluetooth Gerät zu verbinden. Hier machen es sich die Entwickler oft leicht und verlassen sich darauf, dass später ja noch irgendwer ein Handbuch schreibt (das nie gelesen wird) in dem das Pairing ausführlich beschreiben wird. Allerdings erzeugt dieser Teil beim Anwender schon den ersten Stress. Wo waren noch mal die Einstellungen für Bluetooth? Beim letzten Mal hat, es nicht funktioniert (Das kenn glaube ich jeder)? Muss ich die App vorher schon starten? Was habe ich dieses Mal wieder falsch gemacht?

Für den durchschnittlichen Anwender ist das schon eine große Hürde, die er überwinden muss, bevor er die App nutzen kann. Dieses Unbehagen muss nicht sein, denn dank einer sehr umfangreichen und kontinuierlich weiterentwickelten Programmierschnittstelle kann das Pairing mit dem Bluetooth Gerät aus der App heraus geschehen, ohne dass der Anwender auch nur einen Finger krumm machen muss :-). Im besten Fall stellt der Entwickler aber zusätzlich noch eine Möglichkeit zur Verfügung, das Bluetooth-Pairing manuell durchzuführen, um z.B. ein defektes Gerät austauschen zu können oder sich mit unterschiedlichen Geräten verbinden zu können. Über so eine Möglichkeit freut sich am Ende auch der Support, der eine Möglichkeit hat, mit dem Nutzer zusammen das Pairing manuell durchzuführen, falls es hier Probleme gibt.

Die Blue Pair App

Blue Pair App Screenshots

Einen sehr guten Einstieg in das Bluetooth Pairing für App Entwickler bietet „Blue Pair“. Die App ist sowohl im Google Play Store als auch bei F-Droid erhältlich. Wie alle in F-Droid verfügbaren Apps ist auch „Blue Pair“ eine Open Source App, bei der die Sourcen unter einer Open-Source-Lizenz veröffentlicht wurden. Das bedeutet, man kann das komplette Android-Studio Projekt unter https://github.com/aurasphere/blue-pair/ herunterladen. Nach dem Öffnen des sehr einfach aufgebauten Projekts in Android Studio kann man alle Java Dateien, XML Layouts, Strings, Icons, etc. ändern und das Projekt selber kompilieren.

Bei einem ersten Blick in das AndroidManifest.xml File stellt man fest, dass folgende Berechtigungen benötigt werden …

  • <uses-permission android:name=”android.permission.BLUETOOTH_ADMIN” />
  • <uses-permission android:name=”android.permission.BLUETOOTH” />
  • <uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />

 … und es nur eine Activity mit dem Namen MainActivity gibt. In der onCreate Methode wird erst mal geprüft, ob das Gerät überhaupt Bluetooth unterstützt ( boolean hasBluetooth = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) ), was es unmöglich macht, die App mit dem Emulator zu testen, da es hier kein Bluetooth gibt.

Verfügt das Gerät über Bluetooth, wird als nächstes ein Objekt der Klasse BluetoothController instanziiert, die Teil der Blue Pair App ist.  Diese Klasse ist die zentrale Klasse, um die sich hier alles dreht. Folgende „public“ Methoden stehen hier zur Verfügung.

public boolean isBluetoothEnabled()
Gibt true zurück, wenn Bluetooth aktiviert und einsatzbereit ist

public void turnOnBluetooth()
Schaltet den Bluetooth-Adapter ein. Hiermit wird die zugrunde liegende Bluetooth-Hardware eingeschaltet und die Bluetooth-Systemdienste werden aktiviert

public void startDiscovery()
Startet den Prozess der Remote-Geräteerkennung. Der Erkennungsprozess beinhaltet in der Regel einen Anfrage-Scan, gefolgt von einem Scan jedes neuen Geräts, um den Bluetooth-Namen abzurufen.

public void cancelDiscovery()
Bricht die laufende Geräteerkennung ab. Da die Erkennung ein langsames Verfahren für den Bluetooth-Adapter ist, sollte diese Methode immer aufgerufen werden, bevor man versucht, sich connect() mit einem entfernten Gerät zu verbinden

public boolean pair(BluetoothDevice device)
Startet das Pairing mit dem Bluetooth-Gerät.

public boolean isAlreadyPaired(BluetoothDevice device)
Prüft, ob das Gerät schon verbunden ist. Wird in der Blue Pair App verwendet, um das Icon für bekannte Geräte anzupassen.

public static String deviceToString(BluetoothDevice device)
Erzeugt einen String bestehend aus MAC-Adresse und Name des Bluetooth Gerätes.

public boolean isDiscovering()
Gibt true zurück, wenn der mit startDiscovery() gestartete Prozess noch läuft.

public void onBluetoothStatusChanged()
Eine Callback-Methode, die aufgerufen wird, wenn sich der Bluetooth Status ändert.

public int getPairingDeviceStatus()
Liefert den Status des aktuellen Pairings und aktualisiert den Status, wenn das Pairing abgeschlossen ist.

public String getPairingDeviceName()
Ruft den Namen des aktuell angemeldeten Geräts ab.

public static String getDeviceName(BluetoothDevice device)
Gibt den Namen des übergebenen Bluetooth Geräts zurück

public boolean isPairingInProgress()
Prüft, ob gerade ein Pairing Prozess läuft.

public BluetoothDevice getBoundingDevice()
Ruft das aktuell angemeldete Gerät ab.

Alle diese Funktionen basieren auf den Methoden der Klassen android.bluetooth. BluetoothAdapter und android.bluetooth.BluetoothDevice die seit API Level 5 existieren und sich seit dem nur geringfügig geändert haben.

Neben dem BluetoothController gibt es noch ein paar andere Klassen und Interfaces auf die ich hier nun nicht im Detail eingehen werde.

Die komplette Liste aller Klassen:

  • co.aurasphere.bluepair.MainActivity
  • co.aurasphere.bluepair.bluetooth.BluetoothDiscoveryDeviceListener
  • co.aurasphere.bluepair.bluetooth.BroadcastReceiverDelegator
  • co.aurasphere.bluepair.bluetooth.BluetoothController
  • co.aurasphere.bluepair.view.DeviceRecyclerViewAdapter
  • co.aurasphere.bluepair.view.ListInteractionListener
  • co.aurasphere.bluepair.view.RecyclerViewProgressEmptySupport

Dieses sehr interessante Projekt zeigt auf eindrucksvolle Weise, wie einfach es ist, das Bluetooth Pairing aus der App durchzuführen. Blue Pair existiert leider nicht als Modul und kann nicht einfach so in das Gradle File eingetragen (Evtl. ändert der Entwickler das in Zukunft noch 🙂 ). Daher kann man den Blue-Pair Quellcode leider nicht 1 zu 1 übernehmen und weiterverarbeiten. Stattdessen kann man sich aber inspirieren lassen oder einfach platt die nötigen Teile kopieren. Beide Varianten habe ich selbst schon praktiziert und habe dabei sehr schnell gute Ergebnisse erzielt.

Fazit

Es ist einer der wesentlichen Erfolgsfaktoren für eine App, dass die App einfach und intuitiv zu bedienen ist. Aus diesem Grund sollte es sich jeder Entwickler zweimal überlegen, ob er es seinen Nutzern zumuten möchte die App zu verlassen, die Einstellungen zu suchen (die von Gerät zu Gerät unterschiedlich aussehen) und dort das Bluetooth Pairing durchzuführen, statt eine Funktion zum Bluetooth Pairing zu realisieren/kopieren, die auf die Bedürfnisse der jeweiligen Benutzergruppe zugeschnitten ist, nur die relevanten Geräte filtert oder sogar das Pairing voll automatisch durchführt, ohne dass der Anwender etwas davon merkt.