Android Galaxy S4 – Activité visible sur l'écran de verrouillage

Il y a quelques années, j'ai écrit une application d'alarme qui fonctionnait sur Android 2, et j'essaie maintenant de la mettre à niveau pour fonctionner sur Android 4. Plus précisément, sur Samsung Galaxy S4.

Sur Android 2, si le téléphone dormait, il allait réveiller le téléphone et afficher un écran "Snooze ou Dismiss" sur l'écran de verrouillage.

  • Positionnement EditText Au-dessus du clavier
  • Puis-je déclencher la fonctionnalité intégrée de capture de bogues d'Android de mon application?
  • Configuration du profil de matériel de ligne de commande AVD d'Android
  • Création d'un projet de bibliothèque Android autonome à l'aide d'Android Studio (0.8.14)
  • Utilisez le GPS et le fournisseur de réseau en même temps dans Android
  • OnSaveInstanceState et Fragments?
  • Sur Android 4, il réveille le téléphone, mais il faut le débloquer, puis ouvrir la zone des notifications, puis cliquer sur la notification de l'alarme, avant de pouvoir "Ignorer".

    J'ai toujours utilisé ce code pour faire le réveil:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

    J'ai lu 8 questions sur le stackoverflow différentes sur cette question. La plupart d'entre eux donnent le code ci-dessus, qui a fonctionné pour moi il y a des années dans Android 2 mais ne fonctionne pas dans Android 4. Mais aucun d'entre eux ne m'a aidé à résoudre ce problème. Voici les questions que j'ai lues et essayées:

    Android: supprimez ou désactivez par programme l'écran de verrouillage sur le périphérique Samsung Galaxy S2

    Comment afficher une fenêtre TYPE_SYSTEM_ALERT en plein écran?

    Comment puis-je créer une activité visible en haut de l'écran de verrouillage

    Comment démarrer une boîte de dialogue (comme le dimiss / snooze d'alarme) qui peut être cliqué sans déverrouiller l'écran

    Activité d'Android sur l'écran de verrouillage par défaut

    Le périphérique Android est bloqué, mais souhaite que l'alarme sonne et que la boîte de dialogue apparaisse

    Dialogue Android sur l'écran de verrouillage

    Afficher la boîte de dialogue avec les événements tactiles sur l'écran verrouillé dans Android 2.3

    Est-ce que quelqu'un a des idées sur ce qui a changé dans Android 4 qui peut avoir causé cela?

    EDIT: Voici l'un des exemples les plus simples que j'ai vu d'une boîte de dialogue d'alarme qui ne se présente pas «minimisée». Il n'est pas écrit, comme écrit, sur l'écran verrouillé, mais vous pouvez le résoudre avec WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

    Http://wptrafficanalyzer.in/blog/setting-up-alarm-using-alarmmanager-and-waking-up-screen-and-unlocking-keypad-on-alarm-goes-off-in-android/

    Il est écrit avec FragmentActivity et un DialogFragment, mais il fonctionne toujours comme Activité. Il utilise un AlertDialog.Builder pour faire la boîte de dialogue, et si vous essayez de le faire avec une mise en page XML, cela ne fonctionnera pas. Pourquoi?

  • Régler l'alarme depuis Android 4.4 Kitkat
  • Android: comment utiliser AlarmManager
  • Problème d'Android AlarmManager avec réglage et réinitialisation d'une alarme
  • Le volume du haut-parleur (alarme) diminue lorsque les écouteurs sont branchés
  • Comment puis-je transmettre les données d'un BroadcastReceiver à une activité en cours de démarrage?
  • 4 Solutions collect form web for “Android Galaxy S4 – Activité visible sur l'écran de verrouillage”

    Je l'ai compris, et la réponse était très différente de ce que je m'attendais.

    Ce code a été inclus dans l'échantillon d'alarme de Android 2, dans l'activité AlarmAlert.java:

     @Override protected void onStop() { super.onStop(); // Don't hang around. finish(); } 

    Pour référence, vous pouvez voir le fichier à partir du code d'exemple dans le passé de Git ici , contenant la fonction onStop ci-dessus. Cela n'a jamais causé de problème dans Android 2.

    Mais dans Android 4, si le téléphone était éteint, cet onStop déclencherait avant que le téléphone ne se réveille, ce qui "minimise" efficacement l'Activité. Une fois que j'ai supprimé cette fonction, elle a immédiatement fonctionné à nouveau.

    Mais je me demande, est-ce le problème que d'autres personnes aiment @radley et @Guardanis? Il semble peu probable, mais s'il vous plaît, faites-moi savoir si cela corrige vos problèmes aussi.

    Si vous visitez cette réponse à l'avenir, et vous recevez ce problème, ce que j'essayerais est:

    1. Supprimez toutes les fonctions onStop .

    2. Ajoutez ce code à l'activité:

       getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    3. Assurez-vous d'utiliser un thème plein écran, et non un thème de dialogue.

    4. Cela n'a pas changé pour moi, mais vous pouvez essayer de définir showOnLockScreen explicitement dans le manifeste: <activity android:name="com.example.MyActivity" android:showOnLockScreen="true"/>

    5. Une deuxième chose qui n'a pas changé pour moi mais vous pouvez essayer est d'ajouter le drapeau WindowManager.LayoutParams.FLAG_FULLSCREEN

    J'espère que ça aide les autres!

    Je ne suis pas sûr de savoir si c'est le problème dans tous les cas, mais la documentation sur ShowWhenLocked indique qu'il s'applique uniquement à la plus grande fenêtre plein écran . J'avais une fenêtre sur le thème comme un dialogue qui ne fonctionnait pas, mais ça a bien fonctionné, une fois que je l'ai changé dans une fenêtre à plein écran.

    L'une des questions auxquelles vous avez lié a une réponse qui a semblé résoudre ce problème pour moi.

    C'est le code que j'utilise qui semble fonctionner:

     @Override public void onAttachedToWindow() { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onAttachedToWindow(); } 

    Je déclare également explicitement ceci dans la définition d'activité dans le manifeste:

     <activity android:name="com.example.MyActivity" android:label="@string/app_name" android:showOnLockScreen="true" > 

    Activité d'Android sur l'écran de verrouillage par défaut

    Bien. J'ai donc lutté avec celui-ci récemment, mais avec un 5.0.2 Galaxy Tab A. Sans surprise, ce qui fonctionne sur tous les autres appareils ne fonctionne pas sur Samsung (ce qui a été le cas depuis le premier appareil Samsung Galaxy, ils brisent quelque chose de nouveau Chaque version!)

    La solution générale pour afficher une activité sur l'écran de verrouillage pour la plupart des appareils est

     //wake up device and show even when on lock screen getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    Cependant, cela ne fonctionne pas pour les périphériques Samsung. En supprimant FLAG_DISMISS_KEYGUARD cette astuce est néanmoins.

    En regardant les documents relatifs à ce drapeau, nous avons

    Indicateur de fenêtre: lors de la configuration, la fenêtre entraînera le retrait du clavier, uniquement si ce n'est pas un verrou de verrouillage sécurisé. Étant donné qu'un tel verrouillage n'est pas nécessaire pour la sécurité, il ne reviendra jamais si l'utilisateur navigue vers une autre fenêtre (contrairement à FLAG_SHOW_WHEN_LOCKED, qui ne cachera temporairement que les claviers sécurisés et non sécurisés, mais assurez-vous qu'ils réapparaissent lorsque l'utilisateur se déplace Une autre interface utilisateur qui ne les masque pas). Si le protège-clavier est actuellement actif et est sécurisé (nécessite un motif de déverrouillage), l'utilisateur devra toujours le confirmer avant de voir cette fenêtre, sauf si FLAG_SHOW_WHEN_LOCKED a également été configuré.

    Et pour FLAG_SHOW_WHEN_LOCKED nous avons

    Indicateur de fenêtre: drapeau spécial pour laisser apparaître les fenêtres lorsque l'écran est verrouillé. Cela permettra aux fenêtres des applications de préséance sur le protège-clé ou tout autre écran de verrouillage. Peut être utilisé avec FLAG_KEEP_SCREEN_ON pour activer l'écran et afficher la fenêtre directement avant d'afficher la fenêtre de protection des clés. Peut être utilisé avec FLAG_DISMISS_KEYGUARD pour renvoyer automatiquement les claviers non sécurisés. Ce drapeau s'applique uniquement à la fenêtre en plein écran la plus haute.

    Vous pouvez voir qu'ils peuvent être utilisés ensemble, mais il semble que samsung ne dérangera pas avec FLAG_SHOW_WHEN_LOCKED si le périphérique est verrouillé et FLAG_DISMISS_KEYGUARD est présent. Mon application requiert l'installation d'un écran de verrouillage afin d'éliminer le drapeau de verrouillage du clavier qui me permet de montrer les activités en plein écran sur l'écran de verrouillage. Yay pour moi, non pour samsung.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.