Android Kiosk Mode App – So geht’s

In diesem Blog-Post geht es darum, eine App zu realisieren, die im den sogenannten Android Kiosk Modus unterstützt. Dadurch können z.B. Schulen, Restaurants, Hotels, Messen, oder Museen mobile Geräte an die Besucher austeilen und sicher sein, dass die Benutzer oder Mitarbeiter ausschließlich auf diese Kiosk-App zugreifen können und nicht in der Lager sind die Geräteeinstellungen zu öffnen oder andere Apps zu starten.

Die hier verwendete Architektur funktioniert stabil ab Android 7 und verfolgt einen völlig anderen Ansatz als mein ursprünglicher Ansatz, den ich mal für Android 4 entwickelt habe und der darauf aufgebaut hat, dass man einen ForegroundService mit einem FullScreen Fenster verwendet das einfach überall (Sogar auf dem Lock-Screen und über der Actionbar) angezeigt wird. Leider hat sich seit Android 4 sehr viel an dem sog. „Floating Window“ geändert. So ist es nicht mehr möglich das Floating Window über der Actionbar oder auf dem Lock-Screen anzuzeigen. Dafür muss es nicht Fullscreen sein. In meiner App „Floating Timer“ kann man ein Beispiel für die Verwendung der „Floating Window“ Technik sehen.

Architektur der Kiosk-App

Die Idee basiert auf dem Gedanken, dass eine oder mehrere ausgewählte Activities einer App auf dem Android Gerät gestartet, angezeigt und genutzt werden können ohne dass man das Gerät entsperren muss. Also eine App die vom Lock-Screen aus gestartet und genutzt werden kann. Alle anderen Apps und Einstellungen bleiben weiterhin hinter dem Lock-Screen der z.B. durch eine Pin-Nummer, den Fingerabdruck oder ein Muster geschützt ist verborgen.

Ein ungelöstes Problem bei dem Konzept, sind die Quick-Settings über die man auch schnell mal WLAN, Bluetooth oder Mobile-Daten Ein- oder Ausschalten kann. Da man aber seit Android 7 eine Möglichkeit hat, hier eigene Icons zu konfigurieren, kann man einfach die kritischen Icons aus der Liste entfernen und stattdessen eigene Quick-Settings Icons in der Liste anzeigen, die dann evtl. sogar Funktionen in der Kiosk-App übernehmen können wie z.B. der Start einer Activity direkt vom Lock-Screen.

Android Quick-Settings

Bei dem Konzept hat man den großen Vorteil. dass man sich nicht darum kümmern muss, dass alle anderen Apps und die Einstellungen vor unberechtigtem Zugriff geschützt werden müssen, da hier einfach die Lock-Funktionen des Android-Betriebssystems genutzt werden.

Im Vergleich zu meiner vorherigen Variante ist es nicht einmal nötig, eine Activity in einen ForegroundService umzuwandeln. Was heute Auf Grund der Background Execution Limits sowieso nicht mehr zu empfehlen ist. Falls es doch mal nötig ist gibt es unter „Don’t kill my app!“ eine Anlaufstelle für Entwickler und Betroffene.

„Don’t kill my app!“

Die Umsetzung

Um einer Activity zu erlauben, auf einem TODO anzuzeigen muss im AndroidManifest für die betroffenen Activities einfach das Attribut android:showOnLockScreen=“true“ zu setzen. Auf einigen Geräten ist es auch nötig, noch den folgenden Code-Schnispsel in der onCreate Methode der betroffenen Activities auszuführen.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    setShowWhenLocked(true);
} else {
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}

Damit ist der erste Teil schon erledigt. Die entsprechenden Activities werden nun auch auf dem Android Gerät angezeigt, wenn das Handy oder der Tablet gesperrt ist. Zum Testen kann man einfach mal die App starten und das Handy ausschalten. Nach dem einschalten erscheint nicht der Lock-Screen sondern direkt wieder die App. Damit hat man schon die wichtigsten Eigenschaften der Kiosk-App umgesetzt. Allerdings kommt man noch an die Quick-Settings. Alles andere bleibt hinter dem Lock-Screen verborgen.

Auf den Geräten die mir zur Verfügung stehen habe ich probiert alle Quick-Settings zu löschen, aber es scheint so als müssten immer mindestens 6 Quick-Settings aktiv sein. Ich habe aber auch gelesen, dass es auf manchen Handys nur 5 Quick-Settings sein müssen. Als muss die App mindestens 6 Quick-Settings bereitstellen, die man dann nach der Installation in den Quick-Settings Block zeiht. Alle anderen Quick-Settings kann man nun aus dem Block entfernen und so hat man auch dieses kleine Problem gelöst.

Schade ist, dass man das nicht aus der Installation heraus automatisch machen kann. Gerade wenn man auf 100 oder 1000 Geräten die Kiosk Mode App installiert und einrichtet ist das ein manueller Schritt, der ganz schön aufhalten kann.

Die Quick-Settings Tiles

Jedes Quick-Settings Tile muss im AndroidManifest bekanntgemacht werden durch einen speziellen Eintrag der wie folgt auszusehen hat:

        <service
            android:name=".MyTileService"
            android:label="Label"
            android:icon="@drawable/ic_icon"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>

Die Klasse MyTileService ist ein Service, der von android.service.quicksettings.TileService erben muss. Die folgenden Methoden kann man nun überschreiben und mit eigenen Inhalten füllen.

public void onStartListening()
public void onClick() 
// ..... Da gibt es noch viel mehr aber für die Kiosk Mode App reichen die beiden

In der conClick Methode kann mit folgenden 3 Zeilen einfach eine Activity gestartet werden.

Intent i = new Intent(this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityAndCollapse(i);

In der onStartListening Methode reicht es, dem Tile ein Label, Icon und State zu geben und zu aktualisieren.

Tile tile = getQsTile();
tile.setIcon(Icon.createWithResource(this,
 R.drawable.ic_icon));
tile.setLabel("My Tile");
tile.setContentDescription("Tile Description");
tile.setState(Tile.STATE_ACTIVE);
tile.updateTile();

Da man mindestens 6 TileService Klassen benötigt, macht es sinn, eine BasisKlasse zu haben von der dann alle 6 TileService Klassen erben.

Hinweis: Man braucht natürlich auch 6 Einträge in der AndroidManifest.xml Datei.

Die Installation

Die Installation der App ist dann wie gewohnt aus dem App-Store oder dem Enterprise App Store (falls vorhanden).

Nach der Installation muss für eine korrekte Funktion der Kiosk Mode App der Quick-Settings Block bearbeitet werden. Wie schon oben beschrieben ist das leider nicht automatisch möglich und muss vom Administrator (Oder sein HiWi 🙂 ) durchgeführt werden.

Ist alles installiert und konfiguriert, kann man die App starten und wird feststellen, dass die App nach dem Aus- und wieder Einschalten noch aktiv ist. Versucht man dann die App zu wechseln gelingt es nicht, da das Gerät ja noch gesperrt ist. Klickt man auf den Home-Button erscheint wieder der Lock-Screen.
Entsperrt man das Handy nun und öffnet eine andere App (die nicht auf dem Lock-Screen angezeigt werden darf) verhält sich das Handy nach dem Aus- und wieder Einschalten ganz normal. Der Lock-Screen wird angezeigt und von der Kiosk-App ist nichts zu sehen. 🙁
Zum Glück ist da ja noch der Quick-Settings Button der in der onClick Methode die MainActivity startet. Also einfach kurz die Quick-Settings öffnen und auf das Icon klicken. Schon ist die Kiosk-App wieder aktiv und benutzbar ohne dass man das Gerät entsperren muss.

Demo

Im Google Play Store habe ich einfach mal eine kleine Demo Version veröffentlicht, die hoffentlich in ein paar Tagen unter „https://play.google.com/store/apps/details?id=com.jentsch.kioskmodedemo“ verfügbar ist. Aktuell befindet sie sich gerade in Prüfung. Da die Überprüfung momentan länger dauert als sonst kann es aber noch ein wenig dauern.

Den Text findet man aktuell in der Google Play Developer Console

Dankeschön

Ein herzliches Dankeschön geht hier an Stefan, der mich erst auf die Idee gebracht hat. Beim nächsten Segeln gebe ich Dir dafür ein Bier aus 😉