41 votes

Comment quitter le mode Image dans l'image?

Nous avons enterPictureInPictureMode() pour déplacer une activité à partir de sa forme actuelle en une image dans l'image, de la représentation.

Quel est le moyen par lequel nous revenir qui, de retour de l'activité à son état normal, en plus de détruire l'activité? Il n'y a pas d' exitPictureInPictureMode(), leavePictureInPictureMode()ou janeGetMeOffThisCrazyPictureInPictureModeThing() méthode Activity, et la documentation ne semble pas couvrir une alternative.

Je suis intéressé par une solution pour Android O, pour l'image en mode d'image sur les appareils mobiles, mais si cela fonctionne pour Android TV, merveilleux!

Mise à JOUR 2017-04-08: Si ce que vous voulez est pour revenir au mode normal lorsque l'utilisateur clique sur le bouton X pour quitter le picture-in-picture mode, vous pouvez faire quelque chose comme ceci:

  @Override
  public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode);

    if (!isInPictureInPictureMode) {
      getApplication().startActivity(new Intent(this, getClass())
        .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
    }
  }

La clé de bits sont à l'appel startActivity() pour démarrer l'activité actuelle de nouveau avec FLAG_ACTIVITY_REORDER_TO_FRONT. Avec un singleTask de l'activité, vous devez appeler que sur certains non-Activity contexte, comme l' Application singleton. Cela ne semble pas déclencher onStop() ou onStart(), mais il ne déclencher onNewIntent() (avec tout ce que Intent vous passez startActivity()).

14voto

rds Points 5742
  1. Déplacer l'activité vers l'arrière

     activity.moveTaskToBack(false /* nonRoot */);
     
  2. rétablir l'activité à l'avant

     Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
    startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    activity.startActivity(startIntent);
     

3voto

rds Points 5742

Je ne pense pas que l'activité peut décider de quitter Picture-in-picture.

À partir de l' Android O API extrait de la doc:

L'activité d'entrer en mode PIP va dans l'état de pause, mais reste encore commencé. Si l'utilisateur appuie sur le PIP de l'activité, le système affiche un menu permettant à l'utilisateur d'interagir avec; pas de toucher des événements de portée de l'activité alors qu'il est dans le PIP de l'état.

L'activité sera notifiée par onPictureInPictureModeChanged().

1voto

ugur Points 2018

La documentation officielle dit de la fenêtre PIP vient avec le menu qui vous permettent de basculer en plein écran.

La fenêtre PIP est 240x135 dp et est indiqué dans le haut de la couche en un des quatre coins de l'écran, choisi par le système. L'utilisateur peut apporter un PIP menu qui permet de basculer de la fenêtre PIPà en plein écran, ou de fermer la fenêtre PIP, en maintenant enfoncé le bouton Home sur la télécommande. Si une autre vidéo commence à jouer sur l'écran principal, l' De la fenêtre PIP est automatiquement fermé.

Et vous pouvez remplacer PIP événement a changé pour gérer les éléments de l'INTERFACE utilisateur lorsque l'utilisateur bascule en mode PIP.

lien vers onPictureInPictureModeChanged

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    if (isInPictureInPictureMode) {
        // Hide the controls in picture-in-picture mode.
        ...
    } else {
        // Restore the playback UI based on the playback status.
        ...
    }
}

0voto

Grishka Points 481

J'ai trouvé un 100% fiable pour ce faire.

  1. Définir l' taskAffinity d'attribut pour votre PIP activité dans le manifeste de quelque chose comme "com.package.pip". N'est pas n'importe quoi, il a juste à être différent de votre nom de paquet qui est la valeur par défaut de la tâche de l'affinité. Cela va faire lancer dans un tout autre pile comme si c'était une autre application tout à fait.
  2. Chaque fois que vous voulez sortir de la PIP, le lancer avec startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) dans une autre activité.

J'ai juste regardé ce qui se passe lorsque l'application est la principale activité est actuellement en mode PIP et vous le lancez à partir du lanceur et de la pensée que je pourrais reproduire ceci, et j'ai en effet pu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X