web-dev-qa-db-fra.com

Comment lire une vidéo en plein écran en mode paysage avec exoplayer

J'utilise exoplayer pour lire des vidéos à partir de l'URL dans mon application Android. En mode portrait, tout fonctionne comme prévu (avec viewpager, fragments et onglets dans l'activité) ..__ Mon objectif est de lire la vidéo en plein écran lorsque l'utilisateur est en mode paysage. Cela signifie que seule la vidéo sera lue en mode paysage et que tous les autres détails disparaîtront et reviendront à la mise en page originale en mode portrait . Comment puis-je obtenir ce résultat? ou quel est le meilleur moyen d'y parvenir? tout exemple de code sera apprécié.

 Video to be play when portrait

12
scalp007

je suis un noob, donc c'est le meilleur que je puisse aider, d'ailleurs j'ai testé cela dans l'application Exoplayer Demo, j'ai changé la hauteur de l'exoplayer à 600px et j'ai appliqué ce code et cela a fonctionné parfaitement.

ajouter ce code pour détecter l'orientation de l'écran

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);

  // Checking the orientation of the screen
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
     //First Hide other objects (listview or recyclerview), better hide them using Gone.
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
     params.width=params.MATCH_PARENT;
     params.height=params.MATCH_PARENT;
     simpleExoPlayerView.setLayoutParams(params);
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
     //unhide your objects here.
     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
     params.width=params.MATCH_PARENT;
     params.height=600;
     simpleExoPlayerView.setLayoutParams(params);
  }
}

btw si vous n'utilisez pas FrameLayout mais RelativeLayout

      RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();

J'ai oublié que vous devez masquer l'action ou la barre de titre, j'espère que ce code vous aidera, ajoutez ces codes au code ci-dessus, et je pense également que vous devrez étendre votre activité à AppCompatActivity pour que le code getSupportActionBar fonctionne.

if(getSupportActionBar()!=null) {
   getSupportActionBar().hide();
}
//To show the action bar
if(getSupportActionBar()!=null) {
   getSupportActionBar().show();
 }

cela peut également aider à définir le projet entier en plein écran, à masquer la barre d'état.etc, doit être ajouté dans onConfigurationChanged en fonction de l'orientation de l'écran.

En paysage

ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN || View.SYSTEM_UI_FLAG_IMMERSIVE);

Pour sortir du mode plein écran dans PORTRAIT

ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

J'ai édité le code, j'ai ajouté View.SYSTEM_UI_FLAG_IMMERSIVE pour empêcher la barre d'état de s'afficher lorsque l'utilisateur clique sur le bouton de commande de la vidéo.

7
Daiwik Dan

Vous pouvez vérifier l’orientation lors du réglage du lecteur et définir les paramètres en conséquence:

if (getActivity().getResources().getConfiguration().orientation == 
Configuration.ORIENTATION_LANDSCAPE) {
        params = (LinearLayout.LayoutParams) 
exoPlayerView.getLayoutParams();
        params.width = params.MATCH_PARENT;
        params.height = params.MATCH_PARENT;
        exoPlayerView.setLayoutParams(params);
    }

Et cachez la barre d'action:

((AppCompatActivity) getActivity()).getSupportActionBar().hide();
1
Lior Michelzon

Pour les écrans dotés de boutons matériels, si aucune autre vue ne partage l’écran avec PlayerView d’ExoPlayer, l’écran entier sera rempli par défaut. Cependant, pour les appareils avec des boutons virtuels à l'écran, la totalité de l'écran ne sera pas remplie. dans mon cas, les problèmes résolus en ajoutant cette ligne à PlayerView.

ads:resize_mode="fill"

comme j'ai des publicités admob dans la présentation de l'activité, j'ai ajouté cette ligne dans la balise RelativeLayout en haut.

xmlns:ads="http://schemas.Android.com/apk/res-auto"

Je sais que cela n’a aucun sens, cependant, utiliser Android:resize_mode="fill" vous donnera une erreur de construction de gradle.

vous pouvez également supprimer l'interface utilisateur du système pour encore plus d'espace:

    @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        hideSystemUI();
    }
}

private void hideSystemUI() {
    // Enables  "lean back" mode
    // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            // Hide the nav bar and status bar
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);

}

pour plus d'informations, visitez la page des développeurs Android https://developer.Android.com/training/system-ui/immersive

0
solid

Je pense que nous manquons la réponse plus évidente ici. Créez simplement un nouveau fichier de mise en page dans le répertoire layout-land afin que le nouveau fichier de mise en page soit appliqué lorsque vous êtes en mode paysage. 

Dans ce nouveau fichier de présentation, changez simplement le layout_height de votre ExoPlayer en match_parent afin qu’il occupe tout l’écran.

0
Jin

Veillez à définir la longueur et la largeur de la vue du lecteur pour correspondre à son parent, en mode paysage.

  1. Utilisez ceci pour masquer la barre d'état: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  2. Utilisez ceci pour masquer la barre de navigation: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

0
NocTurn