Kiosk-Modus in Android

114

Ich bin gerade dabei zu prüfen, ob und wie eine CF .NET-Unternehmensanwendung für die Ausführung auf Android-Geräten portiert werden kann. Die Anwendung auf Windows Mobile-Telefonen wird im Kioskmodus ausgeführt, wobei die Anwendung nach dem Booten automatisch im Vollbildmodus gestartet wird und die Benutzer nicht versehentlich oder bereitwillig auf andere Teile des Telefons zugreifen können.

Ist es unter Android möglich, nach dem Booten nur eine Anwendung automatisch zu starten und zu verhindern, dass Benutzer versehentlich (oder bereitwillig) auf andere Teile des Android-Geräts zugreifen?

Erik H.
quelle
Lösen Sie Ihr Problem?
Menna-Allah Sami
3
Ja, es ist möglich. Ich habe einen (sehr) langen Blog-Beitrag dazu erstellt: andreas-schrade.de/2015/02/16/…
funcoder
Ich habe auch einen Blog-Beitrag darüber (teilweise) mit Lollipop erstellt - er schließt jedoch den Boot-Empfänger-Teil aus: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi
Ich beantwortete hier eine ähnliche Frage zu verschiedenen Methoden zum Erstellen gesperrter Einweggeräte
Trevor Halvorson

Antworten:

29

Sie können Anwendungen beim Booten automatisch starten, indem Sie die android.intent.action.BOOT_COMPLETEDAbsicht in einem BroadcastReceiver abhören und Ihre Aktivität von dort aus starten. In der Aktivität können Sie sich als neuer Standard-Startbildschirm [1] registrieren und die Tasten verwalten.

Ich denke, es gibt einige Fälle, die Sie nicht bearbeiten können, ohne das Framework zu ändern (wie Longpress auf Home, um aktuell aktive Anwendungen anzuzeigen) - ich könnte mich jedoch auch irren.

Aber für einen Prototyp könnte das ausreichen.

Viel Spaß beim Basteln!

[1]:

<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Valentin
quelle
1
Sie müssen auch das Onbackpressed der ersten Aktivität überschreiben, sonst, wenn Sie die Zurück-Taste drücken, gehen Sie zum Launcher
ademar111190
So erreichen Sie den Systemdialog n Benachrichtigungsleisten, die durch Code deaktiviert wurden
Gnanam R
1
@ GnanamR: Überprüfen Sie meine Antwort unter: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
@Rinkalkumar Führen Sie die App im Vollbildmodus aus.
John61590
17

Sie können dies anpassen (Zugriff auf das Menü deaktivieren, Hinzufügen von Anwendungen einschränken usw.), um den Kiosk zu aktivieren. http://code.google.com/p/android-launcher-plus/

rbot
quelle
7
Könnte ich wissen, warum dies abgelehnt wurde? Ich habe meine vollwertige, derzeit bereitgestellte Android-Kiosk-App geschrieben, indem ich sie auf Android Launcher Plus bearbeitet und entwickelt habe.
Bot
1
In diesem Fall stimme ich sowohl Ihrer Antwort als auch Ihrem Kommentar zu ;-)
Mawg sagt, Monica
@rbot wie hast du das gemacht Ich habe seit Ewigkeiten versucht, eine Kiosk-Anwendung zu erstellen, und fast alles andere gelöst, außer sicherzustellen, dass sich das Benachrichtigungsfach nicht öffnet.
Wakka02
1
@ Wakka02 Ich glaube, ich habe nach einem Fensterwechsel oder einem ähnlichen Ereignis gesucht (das möglicherweise auf das Öffnen des Benachrichtigungsfachs hinweisen kann) und das Fach geschlossen. Ich habe es vor langer Zeit gemacht, erinnere mich also nicht an die Einzelheiten.
Bot
@ Wakka02: Überprüfen Sie meine Antwort unter: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51
17

In der neuen Android L-Vorschau hat Google Task Locking angekündigt , das genau das tut. Es scheint jedoch Wurzel zu brauchen.

In der L Developer Preview wird eine neue Task-Locking-API eingeführt, mit der Sie Benutzer vorübergehend daran hindern können, Ihre App zu verlassen oder durch Benachrichtigungen unterbrochen zu werden. Dies kann beispielsweise verwendet werden, wenn Sie eine Bildungs-App entwickeln, um die Bewertungsanforderungen für hohe Einsätze unter Android zu unterstützen. Sobald Ihre App diesen Modus aktiviert, können Benutzer keine Benachrichtigungen mehr sehen, auf andere Apps zugreifen oder zum Startbildschirm zurückkehren, bis Ihre App den Modus verlässt.

Um eine unbefugte Verwendung zu verhindern, können nur autorisierte Apps die Task-Sperre aktivieren. Darüber hinaus muss die Berechtigung zum Sperren von Aufgaben von einer speziell konfigurierten Gerätebesitzer-App über die android.app.admin.DevicePolicyManager.setLockTaskComponents()Methode erteilt werden .

Gehen Sie folgendermaßen vor, um einen Gerätebesitzer einzurichten:

  • Schließen Sie ein Gerät mit einem Android- userdebugBuild an Ihren Entwicklungscomputer an.
  • Installieren Sie Ihre Gerätebesitzer-App.
  • Erstellen Sie eine device_owner.xmlDatei und speichern Sie sie im /data/systemVerzeichnis auf dem Gerät.
$ adb root
$ adb shell stop
$ rm /tmp/device_owner.xml
$ echo "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" >> /tmp/device_owner.xml
$ echo "&device-owner package=\"<your_device_owner_package>\" name=\"*<your_organization_name>\" />" >> /tmp/device_owner.xml
$ adb push /tmp/device_owner.xml /data/system/device_owner.xml
$ adb reboot

Überprüfen Sie vor dem Verwenden der Task-Sperr-API in Ihrer App, ob Ihre Aktivität autorisiert ist, indem Sie DevicePolicyManager.isLockTaskPermitted () aufrufen.

Rufen Sie an, um die Task-Sperre zu aktivieren android.app.Activity.startLockTask() von Ihrer autorisierten Aktivität aus .

Wenn die Task-Sperre aktiv ist, wird das folgende Verhalten wirksam:

  • Die Statusleiste ist leer und Benutzerbenachrichtigungen und Statusinformationen werden ausgeblendet.
  • Die Schaltflächen "Startseite" und "Letzte Apps" sind ausgeblendet.
  • Andere Apps starten möglicherweise keine neuen Aktivitäten.
  • Die aktuelle App startet möglicherweise neue Aktivitäten, solange dadurch keine neuen Aufgaben erstellt werden.
  • Der Benutzer bleibt in Ihrer App gesperrt, bis eine autorisierte Aktivität aufgerufen wird Activity.stopLockTask().
Nhaarman
quelle
3
developer.android.com/guide/topics/admin/device-admin.html - beim Bereitstellen einer Geräteverwaltungs-App.
Toshe
2
Hier ist mein Artikel über Task-Sperren mit vollständigem Setup-Algorithmus pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan
9

Nachdem ich eine Weile danach gesucht habe, habe ich eine gute Lösung gefunden. Dies funktioniert zwar nur auf gerooteten Geräten, aber ich denke, wenn es nur für diese eine App ist, sollte das Rooten kein Problem sein.

Weitere Informationen finden Sie unter http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/

matt_lethargisch
quelle
5

Starten Sie Ihre App beim Booten

Der beste Weg, dies zu erreichen, besteht darin, Ihre App als Starter festzulegen

<activity ...
  android:launchMode="singleInstance"
  android:windowActionBar="false">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.HOME" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Sperren Sie Ihre App

Am zuverlässigsten ist es, ein Gerät mit Lollipop oder höher zu verwenden und zu verwenden

startLockTask

Zuerst müssen Sie Ihre App als Gerätebesitzer festlegen. Hinweis: Ihr Gerät muss nicht bereitgestellt sein: Wenn Sie es registriert haben, sollten Sie einen Werksreset durchführen und die Kontoregistrierung überspringen.

Um Ihre App registrieren zu können, müssen Sie zuerst eine DeviceAdminReceiver-Komponente einrichten:

package com.example.myapp;

public class MyDeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission received", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "are you sure?";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "Device admin permission revoked", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        // here you must re-lock your app. make your activity know of this event and make it call startLockTask again!
    }
}

Sobald Sie ein nicht bereitgestelltes Gerät haben, können Sie den folgenden Befehl von adb aus starten ( kein Root erforderlich ).

adb shell dpm set-device-owner com.example.myapp/.MyDeviceAdminReceiver

Um zu vermeiden, dass Android den Benutzer auffordert, Ihre App zu pinnen, müssen Sie setLockTaskPackages aufrufen

endlich!

@Override
public void onResume(){
    super.onResume();
    DevicePolicyManager mDevicePolicyManager = (DevicePolicyManager) getSystemService(
            Context.DEVICE_POLICY_SERVICE);
    ComponentName mAdminComponentName = new ComponentName(getApplicationContext(), MyDeviceAdminReceiver.class);
    mDevicePolicyManager.setLockTaskPackages(mAdminComponentName, new String[]{getPackageName()});
    startLockTask();
}
@Override
public void finish(){
    stopLockTask();
    super.finish();
}
Unsinn
quelle
5

Google hat kürzlich die Android-Verwaltungs-API veröffentlicht, mit der der Kiosk-Modus für alle Android-Geräte mit Android 5.1 oder höher einfach eingerichtet und verschiedene andere Richtlinien festgelegt werden können.

Fred
quelle
Super Fund. Hier ist ein direkter Link zu Informationen zum Kiosk-Modus: developer.google.com/android/management/policies/…
Robert Liberatore
3

Einrichtungsgeräte einrichten Seite des Android-Entwicklers hat diese Dinge beschrieben, mit denen Sie leicht mehr Dinge von dort erfahren können.

Jetzt ist es einfach, Android 6.0 Marshmallow- und spätere Geräte als firmeneigene Einweggeräte (COSU) zu konfigurieren .

Keyur
quelle
2

In diesem Forumsbeitrag wurde eine andere mögliche Technik gefunden . Diesen Beitrag zitieren:

http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/10839-android-kiosk-mode-tutorial.html

Mit den folgenden Methoden können Sie eine Anwendung erstellen, die verhindert, dass "normale" Benutzer mit etwas anderem als Ihrer Anwendung spielen.

Die Anwendung besteht aus zwei Modulen. Die Hauptaktivität und ein Service. Der Dienst ist so konfiguriert, dass er beim Booten startet. Wenn der Dienst gestartet wird, wird überprüft, ob die Aktivität ausgeführt wird oder nicht. Wenn es nicht ausgeführt wird, wird ein Timer verwendet, um die Hauptaktivität zu starten.

Wenn die Aktivität angehalten wird, wird der Dienst in einer Sekunde gestartet: Code:

Sub Activity_Pause (UserClosed As Boolean)
    If kiosk Then StartServiceAt(KioskService, DateTime.Now + 1 * DateTime.TicksPerSecond, false)    
End Sub

Wenn der Benutzer auf dem Startbildschirm drückt, wird der Startbildschirm einige Sekunden lang angezeigt. Ihre Anwendung wird jedoch nach einigen Sekunden wieder in den Vordergrund zurückkehren und der Benutzer kann nicht mit anderen Anwendungen interagieren oder die Einstellungen ändern.

Der Dienst ist als Vordergrunddienst festgelegt. Dies verhindert, dass Android unseren Service beendet. Drücken Sie die Stop-Taste, um den Kioskmodus zu deaktivieren.

Es scheint auch eine Beispiel-Postleitzahl für den Kioskmodus zu geben , die ebenfalls heruntergeladen werden kann.

Big Rich
quelle
2

Xposed Framework kann dies tun. Es braucht root und es besteht die Möglichkeit, dass es nicht auf allen Plattformen funktioniert. Suchen Sie in der Klasse android.app.StatusBarManager nach der Methode disable () .

Hier im Android-Quellcode

Hier erfahren Sie, wie Sie Ihr eigenes Modul schreiben: Xposed-Entwicklungs-Tutorial

Es ist viel einfacher als Sie auf den ersten Blick denken. Viel Glück!

JohnyTex
quelle
Gibt es ein Xposed-Modul, von dem Sie glauben, dass es dies tut?
Feuerlord
0

Zusammen mit der Einrichtung Ihrer Anwendung mit einem BOOT-Empfänger und dieser Antwort zur Verhinderung der Erweiterung der Statusleiste funktioniert diese Lösung ab Version 4.4 als vollständige Kiosk-App:

Platzieren Sie in Ihrem onCreate ():

    final View view = (View) findViewById(android.R.id.content);
    if (view != null) {
        //"hides" back, home and return button on screen. 
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                   View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE |
                                   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                   View.SYSTEM_UI_FLAG_FULLSCREEN);
        view.setOnSystemUiVisibilityChangeListener
                (new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        // Note that system bars will only be "visible" if none of the
                        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE |
                                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE |
                                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
                                    View.SYSTEM_UI_FLAG_FULLSCREEN);
                        }
                    }
                });
    }

Dadurch werden die Zurück-Schaltfläche, Apps und die Home-Schaltfläche vollständig ausgeblendet.

Kristy Welsh
quelle
Was ist mit der Benachrichtigungsleiste?
Elshan