web-dev-qa-db-fra.com

Écran épinglant des applications tierces par programmation

Une fois la propriété de l'appareil acquise, j'essaie d'implémenter une méthode pour lui demander de verrouiller une application donnée en mode kiosque (ou en mode épinglage d'écran). Depuis que je possède un appareil, l'utilisateur n'est pas invité à le faire.

Sur le site Web du développeur, une brève description m'indique qu'il est possible de faire ce que j'essaie:

http://developer.Android.com/about/versions/Android-5.0.html#ScreenPinning

Programmation: pour activer le repérage d'écran par programme, appelez StartLockTask () à partir de votre application. Si l'application demandeuse n'est pas un propriétaire de périphérique , L'utilisateur est invité à confirmer. Une application propriétaire de périphérique peut Appeler la méthode setLockTaskPackages () pour permettre aux applications d'être rattachées Sans l'étape de confirmation de l'utilisateur.

Cela indique qu'en tant qu'application propriétaire d'appareil, je peux épingler d'autres applications sans confirmation de l'utilisateur ... mais je ne sais pas comment.

J'ai pu mettre ma propre application en mode épinglé.

Toute aide serait appréciée.

13
kash

La setLockTaskPackages() est utilisée pour spécifier les applications (par leurs noms de package) qui pourront être épinglées par programme sans confirmation de l'utilisateur . La setLockTaskPackages() est appelée à partir de votre application du propriétaire du périphérique ( très probablement dans votre méthode onEnabled() de DeviceAdminReceiver).

Ainsi, dans votre application propriétaire, vous obtiendrez quelque chose comme: 

mDPM.setLockTaskPackages("com.foo.myapp");

et ensuite, dans votre application "com.foo.myapp", vous serez autorisé à appeler: 

startLockTask(); 

Votre application entrera immédiatement en mode Pinning, sans aucune confirmation de l'utilisateur.

Si vous n'avez pas d'abord register votre application avec setLockTaskPackages, l'application sera épinglée mais l'utilisateur devra d'abord confirmer.

Notez également que lorsqu'une application est registered avec setLockTaskPackages(), elle a des comportements différents de ceux du pin manuel:

  • l'utilisateur ne peut pas désépingler manuellement l'application en appuyant longuement sur Retour + Applications récentes. Vous devrez désépingler votre application avec stopLockTask() par programme;
  • Les boutons "Accueil" et "Applications récentes" sont invisibles (non affichés)
  • Lorsque l'application est désépinglée (via stopLockTask ()), l'utilisateur revient directement à la page d'accueil: aucun verrouillage d'écran n'est affiché, même si un garde-clavier est défini (masque, code, ou autre écran du garde-clavier). 
11
Florent Dupont

Je n'ai pas assez de réputation pour un commentaire, mais je vous ferai remarquer que pour les appareils dotés de boutons physiques (comme le Samsung Galaxy Tab A mentionné par @chairman), l'un des moyens de gérer le désépinglage forcé de votre application consiste à implémenter dans votre classe DeviceAdminReceiver Suivant:

@Override public void onLockTaskModeExiting (contexte de contexte, intention de l'intention )

Donc, si votre utilisateur le souhaite, vous pouvez toujours re-épingler votre application;)

3
Paolo Moschini

Voici un extrait de code qui devrait vous aider à démarrer:

DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mDeviceAdminSample = new ComponentName(this, DeviceAdminSample.class);

if (myDevicePolicyManager.isDeviceOwnerApp(this.getPackageName())) {
    // Device owner
    String[] packages = {this.getPackageName()};
    myDevicePolicyManager.setLockTaskPackages(mDeviceAdminSample, packages);
} else {
    // Not a device owner - Prompt user or show error
}

if (myDevicePolicyManager.isLockTaskPermitted(this.getPackageName())) {
    // Lock allowed
    startLockTask();
} else {
    // Lock not allowed - show error or something useful here
}
0
CzarMatt