Zugriff auf Hardware-Features
Mobile Apps entwickeln mit Delphi, Teil 3

Mobile Geräte bieten heute eine Vielzahl von Sensoren, die Apps neue Möglichkeiten eröffnen – von Standortbestimmung über Bewegungssteuerung bis hin zu Videoaufnahmen (Bild 1).

Delphi mit dem FireMonkey-Framework (FMX) abstrahiert den plattformabhängigen Zugriff auf diese Sensoren in Komponenten. Im Folgenden geben wir einen Überblick über die wichtigsten Sensorarten (Location, Beschleunigung, Gyroskop, Kamera, Mikrofon) und zeigen, wie man diese in plattformübergreifenden Anwendungen anspricht.
Sensoren im Überblick
Folgende Sensoren und Hardwarefunktionen kommen auf einen mobilen Device primär zum Einsatz:
- Standort: Liefert die aktuellen Längen- und Breitengrade des Geräts. Einsatz zum Beispiel in Navigation, Geotagging oder Geo-Fencing.
- Beschleunigungssensor (Accelerometer): Misst die lineare Beschleunigung des Geräts in drei Achsen (x/y/z). Anwendung zum Beispiel in Schrittzählern, Fitness-Apps oder zur Lagebestimmung (Neigen, Schütteln).
- Gyroskop (Lagesensor): Erfasst Drehbewegungen und Neigungswinkel. Oft in Kombination mit dem Accelerometer zur Gestenerkennung.
- Kamera: Eingebaute Kamera(s) für Foto- und Videoaufnahmen aller Art.
- Mikrofon: Genutzt zum Beispiel für Spracherkennung und Diktierfunktionen.
FMX stellt plattformübergreifende Komponenten für diese Sensoren bereit; zum Beispiel TLocationSensor für GPS, TMotionSensor für Beschleunigungswerte, TOrientationSensor für Drehung/Lage sowie TCameraComponent und TTakePhotoFromCameraAction für den Kamerazugriff. Entwickler arbeiten so mit Delphi-Klassen, ohne plattformspezifischen Code schreiben zu müssen.
TSensorManager und FMX-Sensor-Komponenten
Delphi verwendet das System.Sensors-Framework, in dem TSensorManager das Zentrum ist. Über TSensorManager.Current erhält man den Sensor-Manager. Vor der Abfrage aktiviert man diesen mit TSensorManager.Current.Activate, damit alle Sensoren erkannt werden. Danach enthält TSensorManager.Current.Sensors eine Liste der gefundenen Sensorinstanzen. Mit GetSensorsByCategory(...) filtert man gezielt nach Kategorien (zum Beispiel Location, Motion).
FMX bietet außerdem Komponenten für gängige Sensoren; man fügt sie einem Formular hinzu (Bild 2).

Sensoren werden durch nicht visuelle Komponenten gekapselt (Bild 2)
AutorBeispiele sind TLocationSensor, TMotionSensor oder TOrientationSensor. So kümmert sich der TSensorManager um die Erkennung, während die FMX-Komponenten konkrete Daten liefern. Ein Beispiel zur Nutzung des Positions-Sensors:
uses System.Sensors, FMX.Sensors, FMX.Location; TSensorManager.Current.Activate; LocationSensor1.Active := True; // GPS-Standort abrufen TSensorManager.Current.Deactivate;
Standortdaten
Die Standortdaten liefert TLocationSensor (FMX.Location). Intern nutzt er die nativen Ortungsdienste (iOS: CoreLocation, Android: Location Services). Man setzt LocationSensor1.Active := True, um die Ortung zu starten. Wichtige Einstellungen sind Accuracy (Genauigkeit) und Distance (Distanz für Updates). Ändert sich die Position um mehr als Distance, wird OnLocationChanged ausgelöst. Dann stehen die Ortungsdaten in NewLocation.Latitude und NewLocation.Longitude zur Verfügung.
Ein Beispiel ist die Anzeige der Position auf einer Karte. Dabei werden über TLocationSensor ermittelten Koordinaten an eine Karte übergeben. Die Karte zeigt einen Marker an der aktuellen Position, der bei jedem Update des Sensors per OnLocationChanged neu gesetzt wird.
Bewegungssensoren (Accelerometer und Gyroskop)
Der TMotionSensor liefert Beschleunigungswerte (AccelerationX/Y/Z) und kann auch Geschwindigkeit oder Zustand ermitteln. Damit lassen sich Schrittzähler oder Fitness-Funktionen realisieren. Der TOrientationSensor gibt die Ausrichtung an. Solche Daten eignen sich für Spiele (Steuerung durch Kippen), VR oder Gestenerkennung. Die Sensorwerte kommen ereignisgesteuert per OnSensorChanged an, sobald man MotionSensor1.Active := True beziehungsweise OrientationSensor1.Active := True setzt.
Kamera- und Audiofunktionen
Delphi erlaubt sowohl direkten Kamerazugriff als auch einfache Aktionen. Mit TTakePhotoFromCameraAction (FMX.MediaLibrary.Actions) startet man die Kamera-App. Beim Auslösen öffnet sich die Kameraoberfläche, der Nutzer macht ein Foto und erhält es im Event OnDidFinishTaking als Bitmap zurück.
Für mehr Kontrolle verwendet man TCameraComponent (FMX.Media). Diese Komponente liefert kontinuierlich Kamerabilder. Man aktiviert sie mit CameraComponent1.Active := True und kopiert Frames per CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, True) in ein FMX-Bitmap. Über Kind wählt man Front- oder Rückkamera aus. So kann man Videostreams oder Fotoaufnahmen direkt in die App einbinden.
Für Audioaufnahmen stellt FMX das TAudioCaptureDevice (FMX.Media) bereit. Über TCaptureDeviceManager.Current.DefaultAudioCaptureDevice erhält man das Mikrofonobjekt. Mit Mic.StartCapture beginnt die Aufnahme, Mic.StopCapture beendet sie. Damit lassen sich zum Beispiel Sprachnotizen realisieren.
Plattformunterschiede und Best Practices
FMX abstrahiert Android und iOS, dennoch gibt es Unterschiede. So müssen iOS-Apps bestimmte Info.plist-Schlüssel setzen (zum Beispiel NSLocationWhenInUseUsageDescription, NSCameraUsageDescription, NSMicrophoneUsageDescription), damit das System um Erlaubnis fragt. Auf Android sind die entsprechenden Permissions (ACCESS_FINE_LOCATION, CAMERA, RECORD_AUDIO) zu deklarieren und bei Bedarf zur Laufzeit einzuholen. Nicht jedes Gerät hat jeden Sensor, prüfen Sie daher TSensorManager.Current.Sensors und behandeln Sie Ausnahmen, falls ein Sensor fehlt.
Ein weiterer Punkt ist die Energieeffizienz: Sensoren können den Akku beanspruchen. Aktivieren Sie daher Sensoren nur bei Bedarf und schalten Sie sie ab, wenn sie nicht mehr gebraucht werden. Nach der Nutzung sollte man TSensorManager.Current.Deactivate aufrufen. Beim Standort-Dienst helfen größere Distance-Intervalle oder geringere Accuracy, um Energie zu sparen.
Praxisbeispiel: Bild aufnehmen und Standort ermitteln
Wir greifen auf das Beispiel aus Teil 1 und 2 (Foto-App mit Standardorterfassung und Kommentarfunktion) zurück. Mit einem Klick auf den Kamera-Button (SpeedButton mit Style-Zuweisung) wird ein Bild aufgenommen, und gleichzeitig werden die aktuellen Standortdaten ermittelt. Danach kann der Nutzer optional einen Kommentar eingeben. Alle Daten (Foto, Position, Kommentar) erscheinen als neuer Eintrag in der Ergebnisliste.
Zuerst wird mit TTakePhotoFromCameraAction die Kamera geöffnet und ein Foto aufgenommen. Dazu platzieren wir ein ActionList-Steuerelement auf dem Formular und wählen die genannte Action aus der Liste der Standardaktionen (Bild 3).

Action zur Steuerung der Bildaufnahme über die Kamera hinzufügen und konfigurieren (Bild 3)
AutorZur Verarbeitung wird das Event TakePhotoFromCameraAction1DidFinishTaking genutzt. Hier wird das aufgenommene Bild gespeichert und zu einem neuen Objekt der Liste hinzugefügt. Einen Ausschnitt aus dem relevanten Quellcode finden Sie hier:
procedure TMainForm.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
var
P: TPhoto;
TempPath: string;
begin
// temporären Pfad für das Foto wählen
TempPath := TPath.Combine(TPath.GetDocumentsPath,
Format('photo_%d.png', [FPhotos.Count + 1]));
Image.SaveToFile(TempPath);
// neues Foto-Objekt erzeugen
P := TPhoto.Create;
P.Id := FPhotos.Count + 1;
P.Path := TempPath;
P.ThumbPath := TempPath; // später evtl. eigene Thumbnails generieren
P.Timestamp := Now;
// Dummy-Daten für Standort und Note
P.Lat := NaN;
P.Lon := NaN;
P.Accuracy := NaN;
P.Note := 'Noch kein Kommentar';
// zur Liste hinzufügen und UI aktualisieren
FPhotos.Add(P);
RefreshListView;
end;

App mit aktiver Kamerafunktion auf einem iPhone (physisch, kein Simulator) (Bild 4)
AutorVorerst werden für die Standortdaten und den Kommentartext Platzhalter-Daten verwendet (Bild 4).
Diese Funktionen sind im nächsten Schritt zu implementieren. Dazu müssen die Berechtigungen auf den mobilen Devices gesetzt werden, um die Geo-Position zu ermitteln. Man nutzt den TLocationSensor. Anschließend öffnet ein Eingabedialog (InputQuery) ein Textfeld für einen optionalen Kommentar. Schließlich werden das Bild, die Position (Latitude/Longitude) und der Kommentar als neuer Eintrag in eine Liste (TListView) übernommen.
Den Projektfortschritt kann man auf GitHub verfolgen und dort auch den Quellcode herunterladen.
Fazit und Ausblick
Delphi erleichtert die Integration von Sensorik, da Hardware-APIs über FMX-Komponenten verfügbar sind. Mit Verständnis der Sensor-Events, Komponenten und Berechtigungen kann man leistungsfähige plattformübergreifende Apps entwickeln. Eine einfache Integration hat das Beispiel mit der Nutzung der Kamera und der Ortungsfunktion demonstriert. Im vierten Teil zeigen wir das Speichern der Daten lokal (SQLite/FireDAC) und optional in der Cloud.