( Edit : Mise à jour après quelques tests supplémentaires)
Vérifiez le dernière documentation .
Cette fonctionnalité semble s'appeler désormais épinglage d'écran, et l'application ne doit pas nécessairement être le propriétaire de l'appareil. Si le propriétaire de l'appareil n'est pas défini, l'utilisateur est invité à accepter. Mais il y a des problèmes avec ceci pour l'utilisation de kiosque, mentionné ci-dessous.
Il existe deux façons d'activer l'épinglage de l'écran :
Manuellement : Les utilisateurs peuvent activer l'épinglage d'écran dans Paramètres > Sécurité > Épinglage d'écran, et sélectionner les tâches qu'ils veulent épingler en touchant l'icône verte d'épinglage dans l'écran des l'icône verte d'épinglage dans l'écran des récents. De manière programmée : Pour activer l'épinglage d'écran de manière programmatique, appelez startLockTask() depuis votre application. Si l'application requérante n'est pas propriétaire de l'appareil, l'utilisateur est invité à confirmer son choix. confirmation. Une application propriétaire de l'appareil peut appeler la méthode setLockTaskPackages() pour permettre aux applications d'être épinglables sans l'étape de confirmation de l'utilisateur. étape.
Si vous activez l'épinglage de l'écran par programme (application non propriétaire de l'appareil) ou sur l'appareil en utilisant l'épinglage dans les récents, vous obtenez le comportement suivant :
Une boîte de dialogue apparaît pour demander à l'utilisateur s'il veut activer l'épinglage de l'écran et s'il veut exiger un mot de passe pour quitter. S'il clique sur oui, la barre d'état et les notifications disparaissent, mais les boutons Retour, Accueil et Récents ne disparaissent PAS. Si l'utilisateur appuie sur home ou recents, un toast apparaît pour l'informer de la manière de quitter l'épinglage de l'écran.
L'utilisateur peut alors maintenir les touches Retour et Récents enfoncées pour quitter l'épinglage de l'écran. Si l'utilisateur a choisi de demander un mot de passe, il sera renvoyé directement à l'écran de verrouillage. Ce comportement signifie qu'il n'est pas adapté à un kiosque. En effet, il est trop facile pour les utilisateurs de kiosques de finir par regarder l'écran de verrouillage.
Pour obtenir un mode kiosque correct, nous devons définir le propriétaire de l'appareil. La documentation de Google indique que vous devez le faire avec NFC :
Pour déployer et activer un propriétaire d'appareil, vous devez effectuer un transfert de données NFC. données NFC d'une application de programmation vers l'appareil alors que ce dernier est dans état non provisionné.
L'utilisation de la technologie NFC pour ce faire semble un peu complexe (que se passe-t-il si un appareil n'est pas équipé de la technologie NFC ?) Je n'ai pas encore enquêté sur ce sujet, donc si quelqu'un peut fournir des informations sur la façon dont vous allez définir le propriétaire de l'appareil par NFC ? Ce qui devient maintenant le point principal de votre question. (c'est-à-dire définir le propriétaire de l'appareil sur un appareil non enraciné).
Mais pour confirmer que le comportement est conforme aux attentes, si vous créez un appareil, vous pouvez définir le propriétaire de l'appareil en suivant les instructions précédentes de Google (en ajoutant un device_owner.xml) comme je l'ai mentionné. aquí
Maintenant, vous pouvez verrouiller correctement l'application, aucun dialogue n'apparaît pour que l'utilisateur accepte, lorsqu'il est activé, les recents et le bouton home disparaissent et l'utilisateur ne peut pas quitter l'application à moins que votre application ne se déverrouille d'elle-même. Un véritable mode kiosque. J'ai testé ceci sur une Nexus 7 2013 avec la dernière version de Lollipop.
L'extrait suivant active le verrou :
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);
if (mDPM.isDeviceOwnerApp(this.getPackageName())) {
Log.d(TAG, "isDeviceOwnerApp: YES");
String[] packages = {this.getPackageName()};
mDPM.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
Log.d(TAG, "isDeviceOwnerApp: NO");
}
if (mDPM.isLockTaskPermitted(this.getPackageName())) {
Log.d(TAG, "isLockTaskPermitted: ALLOWED");
startLockTask();
} else {
Log.d(TAG, "isLockTaskPermitted: NOT ALLOWED");
}