3

Je suis assez nouveau pour Android et je développe actuellement une application Android qui devrait fonctionner en mode Kiosque, de sorte qu'un utilisateur normal ne peut pas quitter l'application ou faire quoi que ce soit en dehors de cela.
Ce que je l'ai déjà fait:Mode Kiosque Android - Empêcher les utilisateurs de "désautoriser" désancrer l'application

  • Je mis mon application comme un périphérique propriétaire
  • I "pin écran" l'application dans le onCreate() - méthode dans le MainActivity en tant que propriétaire de l'appareil
  • Je un bouton dans le MainActivity qui plus tard permet à un administrateur de quitter en entrant un mot de passe. Appels stopLockTask()

Le problème que je rencontrais maintenant, que tout utilisateur peut quitter l'écran épinglage simplement une pression longue sur « retour » et « multi-tâches » boutons en même temps, parce que la tablette sur laquelle l'application devrait fonctionner a hardwarebuttons que je ne peux pas simplement désactiver. (au moins je ne sais pas comment faire cela sans enraciner l'appareil)
Alors est-il possible de désactiver cette combinaison de touches pour quitter l'épinglage de l'écran, ou une solution de contournement? Une approche que je pensais était de repinning l'application dans ma classe AdminReceiver dans le onLockTaskModeExiting(), mais je suis toujours bloqué sur la façon de le faire.

Voici quelques extraits de code de mon MainActivity et la classe AdminReceiver:
AdminReceiver.java

public class AdminReceiver extends DeviceAdminReceiver{ 

@Override 
public void onEnabled(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public CharSequence onDisableRequested(Context context, Intent intent) { 
    return context.getString(R.string.device_admin_warning); 
} 

@Override 
public void onDisabled(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 
    Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show(); 
} 

}

MainActivity.java

public class MainActivity extends Activity { 

private DevicePolicyManager mDpm; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ComponentName deviceAdmin = new ComponentName(this, AdminReceiver.class); 
    mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 

    if (!mDpm.isAdminActive(deviceAdmin)) { 
     Toast.makeText(this, getString(R.string.not_device_admin), Toast.LENGTH_SHORT).show(); 
    } 


    if (mDpm.isDeviceOwnerApp(getPackageName())) { 
     Toast.makeText(this, getString(R.string.device_owner), Toast.LENGTH_SHORT).show(); 

     mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()}); 
     startLockTask(); 
    } else { 
     Toast.makeText(this, getString(R.string.not_device_owner), Toast.LENGTH_SHORT).show(); 
    } 

    Button exit = (Button) findViewById(R.id.exit); 
    exit.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      stopLockTask(); 
     } 
    });} 

Toute aide est très appréciée. Merci!

+0

Comment définissez-vous votre application en tant que périphérique propriétaire? Si votre application est définie en tant que propriétaire du périphérique, le bouton récent sera également masqué. Voir l'exemple DPC pour plus d'informations. – bmg

+0

@Phil, oui comment avez-vous défini propriétaire du périphérique? – portfoliobuilder

Répondre

0

Redémarrez simplement votre activité et re-épinglez l'écran si le mode de tâche de verrouillage s'est terminé sans intention.

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
     if (sharedPreferences.getBoolean(PIN_SHOULD_ENABLED, false)) { 
      context.startActivity(new Intent(context, YOUR_PIN_SCREEN_ACTIVITY.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
    } 
} 
0

Si l'activité est définie comme DEFAULTHOME

<activity 
     android:name=".AppActivity" 
     android:label="Locked Activity"> 
     <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> 

chaque fois que la presse utilisateur le bouton d'accueil de l'activité peut réactiver le verrou sur onCreate, onResume ou onStart. Si l'application a été désactivée avec force en utilisant la vue d'ensemble et la touche de retour et que la liste des activités récentes est vide, l'utilisateur peut seulement appuyer sur le bouton d'accueil qui réactivera le verrou.

Comme la question date de 12 mois, je suis toujours à la recherche d'une solution plus efficace.

0

J'ai eu ce problème et j'ai essayé des réponses dans ce fil de discussion. Je ne recommanderais pas la réponse de Xavier Lin car elle finit par créer plusieurs instances de votre application. Heureusement, j'ai trouvé moi-même une solution.

Dans votre classe qui étend DeviceAdminReceiver, remplacez onLockTaskModeExiting et exécutez le code PIN ici.

public class AdminReceiver extends DeviceAdminReceiver{ 

    @Override 
    public void onLockTaskModeExiting(Context context, Intent intent) { 
     super.onLockTaskModeExiting(context, intent); 

     // Run pinning code here 
    } 
}