web-dev-qa-db-de.com

Kioskmodus in Android

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

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

105
Erik

Sie können Anwendungen automatisch beim Booten starten, indem Sie die Absicht Android.intent.action.BOOT_COMPLETED 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 registrieren [1] und die Tasten bedienen. 

Ich denke, es gibt einige Fälle, mit denen Sie nicht umgehen können, ohne das Framework zu ändern (wie zum Beispiel Longpress bei Home, um die derzeit aktiven Anwendungen anzuzeigen) - ich könnte mich jedoch auch irren.

Aber für einen Prototyp könnte das ausreichend sein.

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>
26
Valentin

In der neuen Android L Preview hat Google Task Locking angekündigt, die genau das. Es scheint jedoch root zu benötigen.

In der L Developer Preview wird eine neue API zum Sperren von Aufgaben eingeführt, mit der Sie Benutzer vorübergehend daran hindern können, Ihre App zu verlassen oder von Benachrichtigungen unterbrochen zu werden. Dies kann beispielsweise verwendet werden, wenn Sie eine Bildungs-App entwickeln, um die Anforderungen für die Bewertung hoher Einsätze unter Android zu erfüllen. Sobald Ihre App diesen Modus aktiviert, können Benutzer keine Benachrichtigungen mehr anzeigen, auf andere Apps zugreifen oder zum Startbildschirm zurückkehren, bis Ihre App den Modus verlässt.

Um eine nicht autorisierte Nutzung zu verhindern, können nur autorisierte Apps die Aufgabensperre aktivieren. Darüber hinaus muss die Berechtigung zum Sperren von Aufgaben von einer speziell konfigurierten Geräteeigner-App über die Methode Android.app.admin.DevicePolicyManager.setLockTaskComponents() erteilt werden.

Gehen Sie folgendermaßen vor, um einen Geräteeigentümer einzurichten:

  • Verbinden Sie ein Gerät, auf dem ein Android userdebug Build ausgeführt wird, mit Ihrem Entwicklungscomputer.
  • Installieren Sie Ihre Geräteinhaber-App.
  • Erstellen Sie eine device_owner.xml - Datei und speichern Sie diese im Verzeichnis /data/system 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

Vergewissern Sie sich vor Verwendung der Task-Sperr-API in Ihrer App, dass Ihre Aktivität autorisiert ist, indem Sie DevicePolicyManager.isLockTaskPermitted () aufrufen.

Rufen Sie zum Aktivieren der Aufgabensperre Android.app.Activity.startLockTask() von Ihrer autorisierten Aktivität aus auf.

Wenn die Aufgabensperre aktiv ist, wird das folgende Verhalten wirksam:

  • Die Statusleiste ist leer und Benutzerbenachrichtigungen und Statusinformationen sind ausgeblendet.
  • Die Schaltflächen Home und Recent Apps sind ausgeblendet.
  • Andere Apps starten möglicherweise keine neuen Aktivitäten.
  • Die aktuelle App kann neue Aktivitäten starten, sofern dadurch keine neuen Aufgaben erstellt werden.
  • Der Benutzer bleibt für Ihre App gesperrt, bis eine autorisierte Aktivität Activity.stopLockTask() aufruft.
17
nhaarman

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

17
rbot

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

Check out http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ für einen anderen Weg

9
matt_lethargic

Einrichtungsseite für Einzelgeräte einrichten von Android-Entwicklern haben diese Dinge beschrieben, von denen Sie leicht mehr darüber erfahren können.

Jetzt ist es einfach, Android 6.0 Marshmallow- und neuere Geräte als firmeneigene Single-Use-Geräte (COSU) zu konfigurieren.

3
Keyur Lakhani

Google hat kürzlich die Android Management API veröffentlicht, mit der der Kioskmodus für alle Android-Geräte, auf denen Android 5.1 oder höher ausgeführt wird, problemlos eingerichtet und verschiedene andere Richtlinien festgelegt werden können.

2
Fred

Eine andere mögliche Technik in diesem Forum Beitrag 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 verhindern, dass "normale" Benutzer mit etwas anderem als Ihrem .__ spielen. Anwendung.

Die Anwendung besteht aus zwei Modulen. Die Hauptaktivität und eine Bedienung. Der Dienst ist so konfiguriert, dass er beim Booten gestartet wird. Wenn der Dienst gestartet wird, wird geprüft, ob die Aktivität ausgeführt wird oder nicht. Wenn es das nicht ist Beim Ausführen wird ein Timer zum Starten der Hauptaktivität verwendet.

Wenn die Aktivität angehalten ist, wird der Dienst in einer .__-Zeit gestartet. zweite: 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 angezeigt für einige Sekunden. Ihre Anwendung kehrt jedoch nach vorne zurück Nach einigen Sekunden kann der Benutzer nicht mit .__ interagieren. andere Anwendungen oder ändern Sie die Einstellungen.

Der Dienst ist als Vordergrunddienst eingestellt. Dies verhindert Android von unserem Service zu töten. Drücken Sie die Stop-Taste, um den Kiosk zu deaktivieren Modus.

Es scheint, dass eine Beispiel-Kiosk-Code-Zip-Datei zum Download zur Verfügung steht .

2
Big Rich

Starten Sie Ihre App beim Booten

der beste Weg, dies zu erreichen, besteht darin, Ihre App als Startprogramm 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>

App sperren

die zuverlässigste Methode ist, ein Gerät mit Lollipop oder höher zu verwenden und zu verwenden 

startLockTask

zuerst müssen Sie Ihre App als Gerätebesitzer festlegen. NB Ihr Gerät muss unprovisioniert 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 zunächst 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 starten ( kein Root erforderlich )

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

um zu verhindern, dass Android die Benutzer dazu 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();
}
2
nonsensei

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

Hier im Android-Quellcode

Sehen Sie hier, wie Sie Ihr eigenes Modul schreiben können: Xposed-Entwicklungstutorial

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

1
JohnyTex

Neben dem Einrichten Ihrer Anwendung mit einem BOOT-Empfänger und dieser Antwort zum Verhindern der Statusleistenerweiterung funktioniert diese Lösung ab 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 der Zurück-Button, die Apps und der Home-Button vollständig ausgeblendet. 

0
Kristy Welsh