Erstellen einer Android-POS-App, die nicht geschlossen werden kann

Veröffentlicht: 2022-03-11

Die Welt der Entwicklung mobiler Apps ist riesig und entwickelt sich ständig weiter, wobei fast täglich neue Frameworks und Technologien auftauchen. Wenn Sie an ein mobiles Gerät denken, denken Sie wahrscheinlich an Ihr Telefon oder vielleicht Ihr Tablet, obwohl sie bei weitem nicht so beliebt sind wie Smartphones.

Apples iOS und Googles Android dominieren den Mobilfunkmarkt, die beide in den letzten zehn Jahren ihre Höhen und Tiefen hatten. Heute werde ich mehr über Android und seine Verwendung auf Geräten sprechen, die nicht unbedingt mobil sind.

Open-Source zu sein, hatte einen wirklich interessanten Nebeneffekt für das mobile Betriebssystem von Google. Sicher, wir denken vielleicht an all die verschiedenen Android-Forks von verschiedenen Smartphone-Unternehmen, aber was ist mit all den Geräten, auf denen Android läuft, die nicht mobil sind? Alles, von Kühlschränken, intelligenten Öfen, Türschlössern bis hin zu POS-Geräten (Point of Sale), kann heutzutage mit Android laufen. Letztere sind der Grund, warum ich diesen Artikel geschrieben habe.

Point-of-Sale (POS)-Geräte können heutzutage Android ausführen

Android-Kassensysteme

Vor ungefähr einem Jahr durfte ich mit einem Android-Gerät spielen, das alles andere als gewöhnlich war, und es ist etwas, das die meisten Leute wahrscheinlich nicht benutzen werden. Bei dem fraglichen Gerät handelt es sich um ein Android-basiertes Kassensystem eines chinesischen Anbieters, das auch über einen integrierten Thermodrucker verfügt (wie er zum Ausdrucken von Belegen in Geschäften oder an Geldautomaten verwendet wird).

Die größte Überraschung war jedoch die Software: Es lief eine Bone-Stock-Version von Android. Wenn ich mich richtig erinnere, lief damals Android 8 oder Android Oreo, wenn Sie Google-Codenamen bevorzugen. Das Gerät selbst sieht aus wie ein tragbares POS-Gerät der alten Schule, aber anstelle der physischen Tastatur, auf der Sie Ihre PIN eingeben würden, verfügt es über einen kapazitiven Touchscreen, wie er in den Android-Telefonen vergangener Zeiten verwendet wurde.

Meine Anforderung war einfach: Ich musste sehen, ob es eine Möglichkeit gibt, die Funktionen dieses Geräts wie den Thermodrucker zu nutzen und gleichzeitig die von uns entwickelte App auszuführen. Sobald ich erkannte, dass die Anforderung selbst möglich war, wurde ich auf ein anderes Problem aufmerksam: Sicherheit .

Die Sache ist die, wenn Sie ein Gerät haben, das Kartenzahlungen und andere Arten von Transaktionen abwickelt, möchten Sie möglicherweise nicht, dass dasselbe Gerät TikTok, Gmail oder Snapchat ausführen kann. Dieses Gerät verhielt sich genau wie ein Tablet und war sogar mit vorinstalliertem Google Play Store ausgestattet. Stellen Sie sich vor, Sie gehen in einen kleinen Supermarkt und sehen, wie Ihre Kassiererin Selfies macht, E-Mails von einem nigerianischen Prinzen öffnet und seltsame, von Malware verseuchte Websites durchsucht.

Und danach übergibt Ihnen der Kassierer dasselbe Gerät, um Ihre PIN einzugeben. Ich persönlich würde mich nicht sicher fühlen, meine Kreditkarteninformationen über ein solches Gerät bereitzustellen.

Sperren von Benutzern aus Android-Menüs

Abgesehen von der Sicherheit musste ich mich einer noch wichtigeren Herausforderung stellen: Ich musste die Person, die das Android-POS-Gerät in meiner App verwendet, sperren. Mit dem Betriebssystem herumzuspielen war keine Option, da diese Geräte an nicht-technische Personen geliefert wurden.

Sicher, Kassierer sind mehr als in der Lage, eine Anwendung zu installieren, aber die meisten von ihnen konnten keine benutzerdefinierten ROMs flashen oder andere Vorgänge auf niedrigerer Ebene ausführen. Die App selbst wurde in React Native geschrieben, obwohl das in diesem Zusammenhang irrelevant ist. Alle Änderungen, die ich vorgenommen habe, befinden sich in nativem Java-Code. Unabhängig davon, was Sie zum Entwickeln Ihrer Hauptanwendung verwenden, sollten diese Optimierungen funktionieren.

Als kleiner Haftungsausschluss funktioniert dieses Verfahren nur für Android-Apps . Apple gibt uns nicht die Kontrolle, die wir brauchen, um so etwas auf einem iPhone oder iPad einfach zu erreichen, was angesichts der geschlossenen Natur von iOS verständlich ist.

Es gibt vier Möglichkeiten, wie ein Benutzer eine Anwendung möglicherweise beenden kann:

  • Verwenden Sie die Home -Taste.
  • Verwenden Sie die Zurück -Schaltfläche.
  • Verwenden Sie die Schaltfläche „Neueste“ .
  • Verlassen Sie Ihre App über die Benachrichtigungsleiste .

Entweder das Klicken auf eine aktuelle Benachrichtigung oder das Aufrufen der Einstellungen von dieser Leiste aus würde dazu führen, dass ein Benutzer unsere Anwendung verlässt. Sie haben auch Gesten, aber am Ende des Tages lösen diese Gesten genau die gleichen Aktionen aus wie normale Tastendrücke.

Außerdem kann es für jemanden, der das Gerät verwaltet, sehr nützlich sein, ein PIN-System zum Entsperren der Anwendung zu haben. Auf diese Weise könnte nur jemand, der eine PIN besitzt, eine andere Version der Anwendung installieren, ohne dem Endbenutzer einen tieferen Zugriff zu bieten.

Der Home-Button

Um zu verhindern, dass ein Benutzer den Home-Button drückt, müssen wir ihn nicht wirklich deaktivieren.

Eine nützliche Funktion von Android ist die Verfügbarkeit verschiedener Launcher. Normalerweise bieten Ihnen diese Apps verschiedene Startbildschirme, App-Schubladen und Zugriff auf verschiedene UI-Anpassungen. Auf jedem Android-Gerät ist eine vom Hersteller vorinstalliert. Letztendlich sind dies nur normale, reguläre Apps mit einer kleinen, aber entscheidenden Ausnahme.

Das heißt, wenn das Betriebssystem unsere Anwendung als Launcher erkennen könnte, könnten wir sie als Standard-Launcher festlegen. Der Nebeneffekt davon ist, dass das Gerät Sie jedes Mal, wenn Sie die Home-Taste drücken, zum Home Launcher führt. Und wenn unsere Anwendung der Home Launcher ist, wird diese Home-Schaltfläche im Grunde nutzlos. Dazu müssen wir die AndroidManifest-XML-Datei in unserem Android-Projekt bearbeiten und diese beiden Codezeilen hinzufügen:

 <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

Die erste Zeile macht unsere App für die Auswahl geeignet, falls der Benutzer die Home-Taste drückt, und die zweite Zeile ermöglicht es, dass unsere App als Standard festgelegt wird, wenn diese Aktion auftritt.

Jetzt musste der Außendienstmitarbeiter nur noch die Anwendung auf dem Gerät installieren, wenn er sie an den Kunden lieferte. Immer wenn Sie eine App installieren, die das Potenzial hat, ein Launcher zu sein, fragt Android Sie, ob Sie einen anderen Launcher verwenden und diesen als Standard festlegen möchten.

Wenn Sie also jetzt die Home-Taste gedrückt oder alle Ihre letzten Anwendungen gelöscht haben, leitet Sie das Gerät automatisch zu meiner Anwendung weiter.

Erstellen einer Android-POS-App, die nicht geschlossen werden kann

Der Zurück-Button

Als nächstes müssen wir den Zurück-Button handhaben. Mobile Apps bieten normalerweise auf dem Bildschirm eine Möglichkeit, durch die Bildschirme zurückzugehen, zumal viele Geräte keine dedizierte „Zurück“-Taste haben.

Vor einigen Jahren war dies bei Apples iOS-Geräten der Fall, die ihr bereits ikonisches Design mit einer einzigen physischen Taste unter dem Bildschirm aufwiesen. In den letzten Jahren haben die meisten Android-Geräte jedoch auch physische Home-Buttons fallen gelassen. Zuerst wechselten sie zu Schaltflächen auf dem Bildschirm, und jetzt sehen wir, dass sie Telefone zugunsten von Gesten auslaufen lassen, da Telefonhersteller zu All-Screen-Geräten mit kleinen Einfassungen und Kinn wechseln.

Das bedeutet, dass die von Android standardmäßig bereitgestellte Zurück-Schaltfläche nicht wirklich benötigt wird, und um diese Schaltfläche völlig nutzlos zu machen, müssen wir nur einen einfachen Codeblock in unsere Aktivität einfügen:

 @Override public void onBackPressed() { } 

Erstellen einer Android-POS-App, die nicht geschlossen werden kann

Dies ist ein ziemlich einfacher Codeblock: Unsere Hauptaktivität ermöglicht es uns, jedes Mal abzufangen, wenn ein Benutzer auf die Schaltfläche „Zurück“ drückt. Da wir in unserem Fall nicht möchten, dass der Benutzer diese Schaltfläche zu oft drückt, um die App zu beenden, können wir einfach die Standardmethode mit einer Methode überschreiben, die nichts tut, und unsere App anweisen, im Falle des Zurück nichts zu tun Taste gedrückt wird.

Auf diese Weise fragen einige Anwendungen nach einer Bestätigung, bevor Sie sie versehentlich beenden, indem Sie zu oft zurückgehen.

Die Schaltfläche „Neueste“.

Wir müssen noch mit der Schaltfläche "Neueste" umgehen, und dies ist die schwierigste. Außerdem ist dies definitiv keine bewährte Methode oder etwas, das Sie in den Play Store schieben sollten, aber es funktioniert hier für unseren Nischenfall.

Genauso wie die Hauptaktivität es uns ermöglicht zu wissen, wann die Zurück-Taste gedrückt wird, können wir auch wissen, wann die App angehalten ist. Was bedeutet das? Dieser Code wird jedes Mal ausgelöst, wenn unsere App von der Vordergrundanwendung in den Hintergrund wechselt.

Beim Abfangen dieses Ereignisses erhalten wir die Aufgaben-ID unserer aktuellen Anwendung und weisen den Aktivitätsmanager an, diese Aufgabe nach vorne zu verschieben. Dazu benötigen wir eine spezielle Berechtigung in derselben Android-Manifestdatei, die wir zuvor bearbeitet haben.

 <manifest xmlns:andro package="com.johnwick"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.REORDER_TASKS" /> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> </application> </manifest>

Auf diese Weise können wir die laufenden Aufgaben lesen und Änderungen an diesen Aufgaben vornehmen. Außerdem müssen wir noch den Moment abfangen, in dem unsere Anwendung in den Hintergrund gesendet wird. Wir können die onPause Methode in unserer Aktivität wieder überschreiben.

Hier holen wir uns den Task-Manager und zwingen ihn, eine bestimmte Aufgabe in den Vordergrund zu rücken. In unserem Fall ist diese spezielle Aufgabe diejenige, die gerade in den Hintergrund gesendet wurde (unsere Anwendung).

 @Override public void onPause() { super.onPause(); ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(getTaskId(), 0); }

Jedes Mal, wenn Sie zum Menü „Zuletzt verwendet“ wechseln möchten, fokussiert die Anwendung automatisch neu. Sicher, der Bildschirm flackert manchmal ein wenig, aber Sie können diese Anwendung nicht beenden. Und hier ist noch eine coole Sache – erinnern Sie sich, wie ich sagte, dass Sie auch beenden können, indem Sie auf eine Benachrichtigung klicken oder direkt über die Benachrichtigungsleiste zu den Einstellungen gehen? Nun, wenn Sie diese Aktionen ausführen, wird die App in den Hintergrund versetzt, was unseren Code auslöst, und dann wird der Benutzer direkt wieder hineingeschoben.

All dies geschieht so schnell, dass der Benutzer nicht bemerkt, was im Hintergrund passiert. Ein weiterer netter Teil dieses Ansatzes ist, dass Ihre Schnellumschalter immer noch verfügbar sind. Sie können beispielsweise immer noch ein WLAN-Netzwerk auswählen oder Töne deaktivieren, aber alles, was erfordert, dass Sie in die eigentliche Einstellungs-App gehen, ist nicht erlaubt.

Erstellen einer Android-POS-App, die nicht geschlossen werden kann

Die Lösung

Ich bin mir nicht sicher, ob dies der beste Weg ist, aber es war trotzdem ein wirklich interessanter Prozess bei der Recherche zu einem Thema, von dem ich nicht einmal wusste, dass es möglich ist. Und es funktioniert! Ein Wort der Warnung: An diesem Punkt gibt es nur zwei Möglichkeiten, wie Sie die Anwendung als Entwickler beenden können – entweder Sie installieren das Betriebssystem neu oder Sie beenden/deinstallieren die App über ADB.

Wenn Sie irgendwie die ADB-Verbindung zum Gerät verlieren, ist mir kein einfacher Weg bekannt, der Sie herausholen könnte. Um das zu vermeiden, baute ich schließlich ein PIN-System auf.

Edge-Fälle

Es gibt einige Situationen, die wir berücksichtigen müssen. Was ist zunächst einmal, wenn ein Gerät neu gestartet wird? Es muss kein manueller Neustart sein, es kann auch ein Absturz des Betriebssystems sein.

Da wir unsere Anwendung zuvor als Standardstartprogramm festgelegt haben, sollte das Betriebssystem unsere Anwendung automatisch starten, sobald es wieder hochfährt. Aber woher weiß Android, dass es Ihren Startbildschirm beim Booten laden soll? Das liegt daran, dass es im Grunde nur Ihren Standard-Launcher lädt. Da wir zu diesem Zeitpunkt der Standardstarter sind, sollten Neustarts kein Problem darstellen. Und könnte Android unsere Anwendung irgendwann töten? Theoretisch könnte es die App töten, wenn der RAM-Speicher voll ist, aber im wirklichen Leben ist dies fast unmöglich. Da unsere App nicht schließbar ist, kann niemand andere Apps öffnen, und daher sollte sich der RAM-Speicher nicht füllen.

Ich kann mir nur vorstellen, dass es sich füllt, wenn unsere Anwendung ein riesiges Speicherleck aufweist, aber in diesem Fall hätten Sie größere Probleme, als Ihren Benutzer in der Anwendung zu halten. Selbst wenn Android irgendwie ein Kill-Signal an unsere Anwendung auslöst, versucht das Betriebssystem immer dann, unsere App erneut zu starten, wenn Sie versuchen, nach Hause zurückzukehren, da es der Standard-Launcher ist, wodurch der Benutzer gesperrt bleibt.

Aufbau einer Hintertür

Als kurze Erklärung gab es in den Anwendungseinstellungen einen Ort, an dem Sie eine PIN eingeben konnten, um die App zu entsperren. Wenn die PIN korrekt ist, werden die von unseren onPause- und onBackPressed-Methoden festgelegten Einschränkungen deaktiviert, indem eine einfache bedingte Anweisung ausgeführt wird. Von dort aus wäre es einem Benutzer erlaubt, die Einstellungen über das Schnellumschaltmenü einzugeben. Danach können Sie den Standard-Launcher jederzeit wieder auf den Standard-Launcher zurücksetzen, und das würde Sie vollständig aus der App herausholen. Es gibt viele Möglichkeiten, wie man mit diesem Teil umgehen könnte, aber es ist gut, einen Mechanismus zu haben, um die gleichen Einschränkungen zu deaktivieren, die Sie eingerichtet haben. Vielleicht könnten Sie eine Fingerabdruckauthentifizierung zum Entsperren durchführen. Die Möglichkeiten sind nahezu unbegrenzt.

Erstellen einer Android-POS-App, die nicht geschlossen werden kann

Einpacken

Schließlich blieb mir eine Anwendung, die niemand schließen oder beenden konnte. Selbst ein Neustart des Geräts würde nicht helfen, da es direkt zum Standard-Startprogramm zurückkehren würde, das derzeit unsere Anwendung ist. Es hat sich für unser Projekt als nützlich erwiesen, und die Befriedigung, etwas so Verrücktes und Ausgefallenes auszuprobieren, war in der Tat großartig und sehr motivierend.

Es gibt viele Geräte und Anwendungsfälle, bei denen Android das Leben von Entwicklern erleichtert hat. Heutzutage ist das Schreiben einer Android-Anwendung viel einfacher als die Verwendung vieler verschiedener plattformspezifischer Sprachen und Tools. Denken Sie an IoT-Geräte, Kioskanwendungen, Kassensysteme, Navigations- und Zahlungsgateways für Taxis und vieles mehr.

Dies sind Anwendungsfälle, in denen Android die App-Entwicklung vereinfacht hat, aber auch Nischenanwendungsfälle, in denen Sie den Zugriff auf ähnliche Weise einschränken möchten, wie wir es in diesem Artikel gezeigt haben.