Android-App für Raspberry programmieren: werGoogelnKann (kann auch Java)

Was in den 90er Jahren die eigene Homepage war, lässt sich inzwischen auf Apps übertragen. Wer als Unternehmen etwas auf sich hält, scheint kaum daran vorbeizukommen, für die Nutzer auch ein eigenes Smartphone-Programm anzubieten. Sei es, um vernetzte Produkte zu steuern, oder auch nur, um gezielter Informationen über Produkte und Veranstaltungen anbieten zu können, als es über eine Website möglich ist. Doch wozu sollte man sich als Privatperson eine App programmieren? Das wollten wir einmal anhand einer eigenen App ausprobieren.
Denn es gibt dafür durchaus sinnvolle Einsatzmöglichkeiten. Beispielsweise, wenn man einen Raspberry Pi benutzt, um damit angeschlossene Geräte zu steuern. Das smarte Zuhause macht schließlich erst dann richtig Spaß, wenn man es mit dem Handy von der Couch aus bedienen kann.
Eigene Apps haben viele Vorteile
Im konkreten Fall wollten wir die Funktionen, über die ein Raspberry Pi zur Bewässerung eines Gartens verfügt , in die App übertragen. Wie praktisch das sein kann, zeigt das im vergangenen Jahr auf den Markt gekommene Smart Garden System von Gardena . Dort lassen sich mit Hilfe des Handys Bewässerungspläne erstellen oder die Bewässerung zeitabhängig starten.





Ebenfalls hilfreich und weniger aufwendig ist es, bestimmte Befehle, die beispielsweise per SMS oder die Befehlszeile an den Raspberry geschickt werden, über eine App mit komfortabler Benutzeroberfläche zu versenden. Das hat viele Vorteile. Zum einen geht es schneller, vorinstallierte Befehle zu verschicken, zum anderen muss man dazu nicht eigens seinen Rechner hochfahren und ein SSH-Terminal öffnen. Zum anderen lässt sich die App auf mehreren Handys installieren, so dass auch Personen ohne technische Vorkenntnisse die Funktionen nutzen können. Darüber hinaus lässt sich in Kombination mit Bash-Skripten die Steuerung deutlich komfortabler einrichten, als es über einen SSH-Client wie Juice(öffnet im neuen Fenster) möglich wäre.
Ein einfaches Programm geht recht schnell
Zuerst die gute Nachricht: Es ist relativ einfach, mit einem Programm wie Android Studio(öffnet im neuen Fenster) eine App anzulegen und auf verschiedenen Seiten Buttons mit festen SSH- oder SMS-Befehlen zu hinterlegen. Die schlechte Nachricht: Was darüber hinausgeht, ist leider nicht mehr so trivial und kann eine zeitaufwendige Angelegenheit werden. Als Anfänger sollte man sich daher überlegen, ob man sich nach ein, zwei Abenden mit dem einfachen Knopfprogramm zufriedengibt oder noch einige Wochen investiert, um das alles schöner und komfortabler zu machen. Das Gefährliche dabei: Wenn es dann funktioniert, kann man schnell programmiersüchtig werden.
Wie geht man dabei am besten vor? Wie kommt man am einfachsten an genau die Zeilen Code, die für den eigenen Zweck funktionieren? Denn eine objektorientierte Sprache wie Java ist alles andere als anfängerfreundlich.
Es gibt genügend Code im Netz
Grundsätzlich bieten sich zwei Möglichkeiten an: Entweder man startet mit einem neuen Projekt und versucht, die erforderlichen Funktionen (Methoden) in neu angelegte Java-Klassen zu integrieren. Oder man modifiziert ein Open-Source-Projekt, das über ähnliche Funktionen verfügt. So gibt es beispielsweise die App Mercury SSH(öffnet im neuen Fenster) , die solche Kommandozeilenbefehle aus JSON-Dateien aufrufen und senden kann.
Wäre es nicht möglich, eine solche, auf dem Handy simpel aussehende App für seine eigenen Zwecke umzumodeln und mit anderen Funktionen zu ergänzen? Doch das ist für einen Anfänger alles andere als trivial. Denn schon kleine Anwendungen können aus vielen in sich zusammenhängenden Java-Klassen bestehen. Da ist es besser, klein anzufangen.
Andererseits ist es nicht so, dass es an Android-Code im Internet mangelt. In der Regel reicht es aus, die gesuchten Begriffe bei Google einzugeben. Mit sehr großer Wahrscheinlichkeit landet man dann bei einer entsprechenden Diskussion auf Stackoverflow(öffnet im neuen Fenster) , wo ein anderer Programmieranfänger das gleiche Problem hatte und dort um Hilfe gebeten hat. Das machen professionelle Programmierer im Grunde auch nicht anders.
Verstehen Sie Javanesisch?
Für unseren Zweck war es zunächst ausreichend, verschiedene Buttons auf der Startseite der App zu platzieren und diese mit einer Funktion zu verknüpfen. Das geht verhältnismäßig einfach und erfordert bei einer SMS nur wenige Zeilen Code(öffnet im neuen Fenster) . Dieser Code wird in die Java-Klasse MainActivity eingetragen, die Android Studio beim Anlegen eines neuen Projekts generiert ( Tutorial(öffnet im neuen Fenster) ) und die als Startseite der App fungiert. Das Layout für die Schalter wird in der XML-Datei activity_main festgelegt, die sich in dem Ressourcen-Ordner res befindet. Zu guter Letzt müssen in der XML-Datei AndroidManifest noch die Berechtigungen der App eingetragen werden, beispielsweise für das Senden einer SMS oder den Internetzugriff. Fertig ist die App.
Dazu muss man als Anfänger nicht einmal verstehen, wie folgender Code auf "Javanesisch" beschrieben würde:
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
werGoogelnKann (kann, java)
}
});
Dabei wird zunächst dem Objekt button über die Methode setOnClickListener ein neu instanziiertes Objekt einer anonymen inneren Klasse basierend auf dem Interface OnClickListener zugewiesen. Das klingt für einen Anfänger so verschwurbelt wie ein Text des Soziologen Niklas Luhmann(öffnet im neuen Fenster) . Doch auch ohne Kenntnis von Java-Sprech lässt sich in dem Code eine gewisse Logik erkennen, die man für seine Zwecke anpassen kann. Wird der Button geklickt, wird die Methode werGoogelnKann ausgeführt, der dabei die Parameter kann und java übergeben werden. Diese Methode könnte wiederum Methoden aus der Klasse SmsManager aufrufen und eine SMS verschicken.
Rooten nicht erforderlich
Um die App auf dem Smartphone zu installieren, muss zumindest der Entwicklermodus freigeschaltet werden(öffnet im neuen Fenster) . Ein Rooten des Gerätes ist nicht erforderlich. Nach der Aktivierung des USB-Debugging kann Android die App installieren und starten.
Zugegeben: Am ersten Abend gelang es nicht, mehrere Schalter mit unterschiedlichem Inhalt zu programmieren. Ohnehin kann es einige Zeit dauern, Android Studio und die Java-Entwicklungsumgebung JDK (Java Development Kit) zu installieren. Etwas aufwendiger wird es zudem, wenn die App SSH-Befehle verschicken(öffnet im neuen Fenster) soll. Hierzu muss noch eine externe Programmbibliothek wie JSch(öffnet im neuen Fenster) installiert werden, wofür es mehrere Möglichkeiten gibt(öffnet im neuen Fenster) . Android Studio legt für jede App im Verzeichnis AndroidStudioProjects einen Unterordner an, wo das gesamte "Package" gespeichert wird.
Wie lerne ich am besten Java?
Das alles ist, wie erwähnt, auch für einen Anfänger in wenigen Stunden umzusetzen. Weil das so schön klappt und einfach ist, kann man leicht übermütig werden. Doch das kann täuschen. Simpel erscheinende Anwendungen können schwierig umzusetzen sein. So wollte ich "mal schnell" eine App schreiben, die sich automatisch zu einer bestimmten Zeit in die morgendliche Telefonkonferenz einwählt, wenn ein Headset eingesteckt ist.
Doch ein Äquivalent für einen Linux-Cronjob gibt es bei Android nicht, so dass sich die kleine Funktion längst nicht so einfach programmieren ließ wie gedacht. Womit sich die Frage stellte, ob es doch nicht besser wäre, sich Java für Android systematischer anzueignen.
Viele Tutorials und Anleitungen im Netz
Hierzu gibt es ebenfalls reichlich Möglichkeiten im Netz. Wer sich längerfristig Android-Apps programmieren möchte, kann beispielsweise den Klassiker "Java ist auch eine Insel" durcharbeiten(öffnet im neuen Fenster) . Ältere Auflagen sind komplett online(öffnet im neuen Fenster) , zudem gibt es eine Aufgabensammlung(öffnet im neuen Fenster) . Eine 320-seitige Einführung in die Entwicklung von Android-Apps lässt sich bei der Universität Trier herunterladen ( PDF(öffnet im neuen Fenster) ). Unter Javabeginners.de(öffnet im neuen Fenster) finden sich mehrere Hundert "Java-Tips und Quelltexte für Anfänger".
Empfehlenswert sind zudem kürzere Android-Tutorials, von denen es im Netz viele gibt. Unter Programmierenlernenhq.de(öffnet im neuen Fenster) finden sich zwei ausführliche Anleitungen, wie sich Apps programmieren lassen. Dazu zählt auch eine Anleitung, wie eine SQLite-Datenbank integriert wird(öffnet im neuen Fenster) . Mit Hilfe solcher Internetanleitungen lässt sich die App weiter aufhübschen. Gerade bei Lehrbüchern gibt es hingegen das Problem, dass genau die Beispiele, die man sucht, oft nicht enthalten sind.
Um die Bewässerung komfortabler zu gestalten, lassen sich weitere Bedienelemente einbinden. Solche Elemente sind beispielsweise Checkboxen oder Timepicker beziehungsweise Numberpicker. Auch diese lassen sich relativ problemlos einbinden. Wobei die grafische Einbindung von Bedienelementen (Widgets) über die Design-Ansicht der XML-Dateien alles andere als komfortabel ist. Auf der Seite des Raspberry Pi ist dann noch ein Skript erforderlich, das die übertragenen Parameter in entsprechende Crontab-Einträge umwandelt(öffnet im neuen Fenster) .
Mit Datenbanken wird es komplizierter
Das Problem an solchen einfachen und festkodierten Befehlen in der App: Jede Änderung von Parametern ist nur über Android Studio möglich. Viel einfacher ist es natürlich, Variable wie IP-Adressen, Gerätebezeichnungen oder Benutzernamen und Passwörter direkt in der App einzugeben. Damit steigt jedoch der Programmieraufwand erheblich. Vor allem, wenn man die Daten mit Hilfe einer Datenbank wie SQLite einbinden will.
Die einfachere Möglichkeit sind sogenannte Shared Preferences. Damit lassen sich einfache Datensätze speichern. Anleitungen finden sich ebenfalls reichlich im Netz(öffnet im neuen Fenster) . Hierbei ist es sinnvoll, solche neuen Funktionen zunächst in einer eigenen App auszuprobieren. Falls man mit einer Anleitung nicht zurechtkommt oder die Funktion nicht den Erwartungen entspricht, erspart man sich den Aufwand, in der funktionierenden App-Version wieder alles rückgängig zu machen. Zudem lässt sich so vermeiden, dass Fehler bei der Implementierung in die eigene App entstehen und die Funktion vielleicht deshalb nicht läuft.
Frickellösung statt Versionsverwaltung
Vor größeren Änderungen empfiehlt es sich, ein neues Projekt auf der Basis des bestehenden Codes anzulegen. Auf diese Weise steht immer eine kompilier- und lauffähige Version für kleine Änderungen zur Verfügung. Das ist jedoch nicht so einfach wie bei einem Word-Dokument, wo die Datei nur unter einem neuen Namen abgespeichert werden muss. Am einfachsten ist es wohl, das Package mit einem Dateimanager in ein neues Verzeichnis zu kopieren und dann das geänderte Verzeichnis wie hier beschrieben(öffnet im neuen Fenster) in der App einzutragen.
Korrekter als solch eine "Frickellösung" ist allerdings die Nutzung einer Versionsverwaltung(öffnet im neuen Fenster) (VCS) wie Git. Wer den Aufwand einer eigenen Installation scheut, kann auf öffentliche VCS wie Github zurückgreifen. Doch Vorsicht: Bei einigen Anbietern sind die sogenannten Repositories für alle frei sichtbar - inklusive festkodierter Passwörter.
Aufwand für SQLite-Datenbank hoch
Komplexer als die Nutzung von Shared Preferences ist der Aufbau einer eigenen SQLite-Datenbank. Dies könnte beispielsweise dazu genutzt werden, komplette Kommandozeilenbefehle frei in der App einzugeben, ohne dazu Android Studio nutzen zu müssen. Solche Apps sind im Play Store verfügbar(öffnet im neuen Fenster) . Allerdings ist beim Selbstprogrammieren der Aufwand nicht zu unterschätzen. Einfacher dürfte es sein, in Android Studio gelegentlich einen neuen Button nachzutragen.
Spätestens dann dürfte die App über mehrere Aktivitäten (Activitys), also unterschiedliche Bildschirmseiten, verfügen. Es könnte daher von Anfang an sinnvoll sein, diese Funktionen gleich in einer entsprechenden Activity-Klasse anzulegen und von der Startseite darauf zu verlinken. Aktivitäten müssen wiederum in der Manifest-Datei angemeldet werden. Sonst lässt sich die App zwar kompilieren und installieren, stürzt beim Aufrufen der Activity jedoch ab.
Fremder Code im falschen Kontext
Womit wir beim schwierigen Thema Fehlersuche wären. Der Vorteil von Android Studio oder anderen Java-Entwicklungsumgebungen: Viele Fehler werden gleich bei der Eingabe rot unterlegt. Wenn man beispielsweise eine Variable sowie einen Klassen- oder Methodennamen falsch eingibt, fällt dies sofort auf. Der Import fehlender Klassen wird vorgeschlagen und ist recht einfach. Das hilft dem Anfänger natürlich sehr, einen Code einzugeben, der zumindest kompiliert werden kann.
Wer Code aus fremden Quellen einbaut, hat häufig Probleme mit der sogenannten Referenzierung von Objekten. Heißt es getApplicationContext() , getContext() , getBaseContext() oder einfach nur this ? "Ich habe darüber auf der Entwicklerseite gelesen, aber bin nicht in der Lage, es richtig zu verstehen" , klagte ein Entwickler auf Stackoverflow(öffnet im neuen Fenster) . Wobei die offizielle Entwicklerseite https://developer.android.com(öffnet im neuen Fenster) für Anfänger in der Tat wenig hilfreich und häufig eher verwirrend ist. Da hilft es manchmal nur, bestimmte Varianten auszuprobieren oder weiter zu googeln.
Die eigene App spioniert wenigstens nicht
Hilfe bei der Suche nach Fehlern gibt Android Studio beim Kompilieren selbst. In den Logdaten werden die Fehler aufgezeigt, die ein erfolgreiches Kompilieren verhindern. Damit kann man dann wiederum versuchen, per Google Hinweise zu finden, um die Fehler zu beheben. Allerdings werden die Klassen in der Menüstruktur ohnehin schon rot unterlegt, wenn Android Studio darin Fehler entdeckt. Es ist für den Anfänger daher ein sehr schönes Gefühl, wenn die roten Klassen in der App endlich verschwunden sind.
Die im vergangenen Winter programmierte Garten-App hat sich im Laufe des Sommers durchaus als funktionierend und nützlich erwiesen. Wobei wegen des vielen Regens eher eine Entwässerungs- als eine Bewässerungs-App nützlich gewesen wäre. Ganz so komfortabel wie die Gardena-App ist das Programm jedoch nicht. Dazu wäre es wohl erforderlich, auf dem Raspberry Pi ebenfalls mit einer SQLite-Datenbank zu arbeiten und diese Daten jeweils mit der App zu synchronisieren. Das ist für einen Anfänger jedoch mit einem sehr hohen Aufwand verbunden. Zudem reichen Cronjobs für diese Zwecke völlig aus.
Maßgeschneiderte Funktionen statt App von der Stange
Ein weiterer großer Vorteil der eigenen App: Man weiß zumindest, was das Programm wirklich macht. So entdeckte eine Sicherheitsfirma kürzlich einen Anbieter, der seit Jahresanfang rund 4.000 Apps mit bösartigem Inhalt in Umlauf gebracht haben soll . Google fand neulich eine Staatstrojaner-Familie für Android . Eine spionierende Taschenlampen-App war millionenfach heruntergeladen worden . Und um zu verstehen, was Open-Source-Apps machen, können rudimentäre Android-Kenntnisse nicht schaden.
Insgesamt lohnt sich die eigene App zum Steuern eines Raspberry Pi durchaus. Schließlich lassen sich wohl nur auf diese Weise die Funktionen des Bastelcomputers exakt mit der Steuerung durch das Smartphone abgleichen. Das lässt sich mit einer App aus dem Play Store nicht so einfach umsetzen. Mit zunehmender Erfahrung wird es einfacher, sich aus dem Code anderer Apps die gewünschten Funktionen zusammenzusuchen.
Am Ende steht dann ein maßgeschneidertes Produkt, das mit viel Googeln aus dem Internet zusammengesucht wurde. Einen handfesten Nachteil gibt es jedoch: Wenn die ältere Verwandtschaft endlich ein neues Smartphone mit Messengerdienst hat und einen dann bittet: "Schreib mir mal schnell 'ne App" , zuckt der Möchtegern-Programmierer vor Schreck unwillkürlich zusammen. So schnell geht das dann doch wieder nicht.



