Modalità Kiosk in Android


114

Sto valutando se e come è possibile eseguire il porting di un'applicazione aziendale CF .NET per l'esecuzione su dispositivi Android. L'applicazione sui telefoni Windows Mobile viene eseguita in modalità kiosk in cui l'applicazione si avvia automaticamente in modalità a schermo intero dopo l'avvio e gli utenti non possono accedere accidentalmente o volontariamente ad altre parti del telefono.

È possibile su Android avere una sola applicazione che si avvia automaticamente dopo l'avvio e impedire agli utenti di accedere accidentalmente (o volontariamente) ad altre parti del dispositivo Android?


Risolvi il tuo problema?
Menna-Allah Sami

3
Sì, è possibile. Ho creato un (molto) lungo post sul blog su questo: andreas-schrade.de/2015/02/16/…
funcoder

Ho anche creato un post sul blog su questo (parzialmente) usando Lollipop - esclude però la parte del ricevitore di avvio: sureshjoshi.com/mobile/android-kiosk-mode-without-root
SJoshi

Ho risposto a una domanda simile qui su diversi metodi per creare dispositivi monouso bloccati: stackoverflow.com/a/43644803/2888763
Trevor Halvorson

Risposte:


29

Puoi avviare automaticamente le applicazioni all'avvio ascoltando l' android.intent.action.BOOT_COMPLETEDintento in un BroadcastReceiver e avviare la tua attività da lì. Nell'attività puoi registrarti come nuova schermata iniziale predefinita [1] e gestire le chiavi.

Penso che ci siano alcuni casi che non puoi gestire senza modificare il framework (come longpress su Home per mostrare le applicazioni attualmente attive) - Potrei anche sbagliarmi.

Ma per un prototipo potrebbe essere sufficiente.

Buon divertimento!

[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>

1
È inoltre necessario sovrascrivere l'onbackpress della prima attività altrimenti quando si preme il pulsante Indietro si va al programma di avvio
ademar111190

Come ottenere le barre di notifica della finestra di dialogo di sistema n disabilitate tramite codice
Gnanam R

1
@GnanamR: controllare la mia risposta a: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

@Rinkalkumar Esegui l'app in modalità a schermo intero.
John61590

17

Puoi personalizzarlo (disabilitare l'accesso al menu, limitare l'aggiunta di applicazioni, ecc.) Per abilitare il chiosco. http://code.google.com/p/android-launcher-plus/


7
Potrei sapere perché questo è stato downvoted? Ho scritto la mia app kiosk Android completa e attualmente distribuita modificando e sviluppando su Android Launcher plus.
rbot

1
In tal caso, ho votato a favore sia della tua risposta che del tuo commento ;-)
Mawg dice reintegrare Monica

@rbot come hai fatto? Ho provato a creare un'applicazione kiosk per anni e ho risolto quasi tutto il resto tranne che per assicurarmi che la barra delle notifiche non si aprisse.
Wakka02

1
@ Wakka02 Penso che stavo cercando onwindowchanged o un evento simile (che potrebbe indicare l'apertura del vassoio di notifica) e chiudere il vassoio. L'ho fatto molto tempo fa, quindi non ricordare i dettagli.
rbot

@ Wakka02: controllare la mia risposta a: stackoverflow.com/questions/11958034/hide-tablet-system-bar
Basher51

17

Nella nuova anteprima di Android L, Google ha annunciato il blocco delle attività , che fa esattamente questo. Tuttavia, sembra aver bisogno di root.

L'anteprima per sviluppatori L introduce una nuova API di blocco delle attività che ti consente di impedire temporaneamente agli utenti di lasciare la tua app o di essere interrotti dalle notifiche. Questo potrebbe essere utilizzato, ad esempio, se stai sviluppando un'app per l'istruzione per supportare i requisiti di valutazione delle poste in gioco su Android. Una volta che la tua app ha attivato questa modalità, gli utenti non saranno in grado di vedere le notifiche, accedere ad altre app o tornare alla schermata Home finché l'app non uscirà dalla modalità.

Per impedire l'utilizzo non autorizzato, solo le app autorizzate possono attivare il blocco delle attività. Inoltre, l'autorizzazione al blocco delle attività deve essere concessa da un'app del proprietario del dispositivo appositamente configurata, tramite il android.app.admin.DevicePolicyManager.setLockTaskComponents()metodo.

Per configurare un proprietario del dispositivo, segui questi passaggi:

  • Collega un dispositivo che esegue una userdebugbuild Android alla tua macchina di sviluppo.
  • Installa l'app del proprietario del dispositivo.
  • Crea un device_owner.xmlfile e salvalo nella /data/systemdirectory sul dispositivo.
$ 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

Prima di utilizzare l'API di blocco delle attività nella tua app, verifica che la tua attività sia autorizzata chiamando DevicePolicyManager.isLockTaskPermitted ().

Per attivare il blocco delle attività, chiama android.app.Activity.startLockTask() dalla tua attività autorizzata.

Quando il blocco delle attività è attivo, ha effetto il seguente comportamento:

  • La barra di stato è vuota e le notifiche utente e le informazioni sullo stato sono nascoste.
  • I pulsanti Home e App recenti sono nascosti.
  • Altre app potrebbero non avviare nuove attività.
  • L'app corrente può avviare nuove attività, a condizione che ciò non crei nuove attività.
  • L'utente rimane bloccato sulla tua app finché non viene chiamata un'attività autorizzata Activity.stopLockTask().

3
developer.android.com/guide/topics/admin/device-admin.html - sulla distribuzione di un'app di amministrazione del dispositivo.
Toshe

2
Ecco il mio articolo su Task Locks con algoritmo di configurazione completo pvolan.blogspot.ru/2017/01/android-50-kiosk-mode-aka-super.html
PVoLan

9

Dopo aver cercato questo per un po ', ho trovato una buona soluzione. Funziona solo su dispositivi con root, ma immagino che se è solo per questa app, il rooting non dovrebbe essere un problema.

Controlla anche http://thebitplague.wordpress.com/2013/04/05/kiosk-mode-on-the-nexus-7/ per un altro modo


5

Avvio della tua app all'avvio

il modo MIGLIORE per farlo è impostare la tua app come launcher

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

Blocco della tua app

il modo più affidabile è utilizzare un dispositivo con Lollipop o superiore e utilizzarlo

startLockTask

per prima cosa devi impostare la tua app come proprietaria del dispositivo. NB il tuo dispositivo non deve essere predisposto: se lo hai registrato dovresti fare un reset di fabbrica e saltare la registrazione dell'account.

per poter registrare la tua app devi prima configurare un componente DeviceAdminReceiver:

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!
    }
}

una volta che hai un dispositivo senza provisioning puoi avviare il seguente comando da adb ( non è richiesto root )

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

per evitare che Android chieda all'utente le autorizzazioni per bloccare la tua app, devi chiamare setLockTaskPackages

finalmente!

@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();
}


3

Imposta dispositivi a scopo singolo La pagina dello sviluppatore Android ha descritto queste cose che puoi facilmente conoscere più cose da lì.

Ora è facile configurare Android 6.0 Marshmallow e dispositivi successivi come dispositivi di proprietà aziendale, monouso (COSU).


2

Ho trovato un'altra possibile tecnica in questo post del forum . Citando quel post:

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

Utilizzando i seguenti metodi puoi creare un'applicazione che impedirà agli utenti "normali" di giocare con qualsiasi cosa diversa dalla tua applicazione.

L'applicazione è composta da due moduli. L'attività principale e un servizio. Il servizio è configurato per l'avvio all'avvio. Quando il servizio viene avviato, controlla se l'attività è in esecuzione o meno. Se non è in esecuzione utilizza un timer per avviare l'attività principale.

Quando l'attività viene sospesa, pianifica l'avvio del servizio in un secondo: Codice:

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

Se l'utente preme sulla schermata iniziale, la schermata principale apparirà per diversi secondi. Tuttavia la tua applicazione tornerà in primo piano dopo pochi secondi e l'utente non sarà in grado di interagire con altre applicazioni o modificare le impostazioni.

Il servizio è impostato per essere un servizio in primo piano. Ciò impedisce ad Android di interrompere il nostro servizio. Premere il pulsante Stop per disattivare la modalità kiosk.

Sembra esserci anche un file ZIP di codice in modalità kiosk di esempio disponibile per il download .



0

Oltre a configurare la tua applicazione con un ricevitore BOOT e questa risposta per impedire l'espansione della barra di stato, questa soluzione funziona su 4.4 e versioni successive come app kiosk completa:

Posiziona nel tuo 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);
                        }
                    }
                });
    }

Questo nasconderà completamente il pulsante Indietro, le app e il pulsante Home.


che dire della barra delle notifiche?
Elshan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.