Android视频播放器ExoPlayer全屏

布局添加全屏按键

1. app gradle

dependencies {

implementation 'com.google.android.exoplayer:exoplayer:2.11.1'

android {

compileOptions {        targetCompatibility JavaVersion.VERSION_1_8    }

2. AndroidManifest配置权限

权限

 -permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

屏幕允许翻转

:name=".MainActivity" android:configChanges="orientation">

3. activity布局

注意:使用自定义布局,需要在exoplayer2.ui.PlayerView中,使用app:controller_layout_id指明使用的布局文件
MainActivity

:id="@+id/exo_player"        android:layout_width="match_parent"        android:layout_height="match_parent"        app:controller_layout_id="@layout/my_exo_player_control_view"/>

my_exo_player_control_view

<?xml version="1.0" encoding="utf-8"?>:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:id="@+id/myExoPlayer"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_gravity="bottom"    android:background="?attr/colorControlHighlight">    :id="@id/exo_prev"        style="@style/ExoMediaButton.Previous"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toStartOf="@+id/exo_rew"        app:layout_constraintStart_toStartOf="parent" />    :id="@id/exo_rew"        style="@style/ExoMediaButton.Rewind"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toStartOf="@+id/exo_play"        app:layout_constraintStart_toEndOf="@id/exo_prev" />    :id="@id/exo_play"        style="@style/ExoMediaButton.Play"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toStartOf="@+id/exo_pause"        app:layout_constraintStart_toEndOf="@id/exo_rew" />    :id="@id/exo_pause"        style="@style/ExoMediaButton.Pause"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toStartOf="@+id/exo_ffwd"        app:layout_constraintStart_toEndOf="@id/exo_play" />    :id="@id/exo_ffwd"        style="@style/ExoMediaButton.FastForward"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toStartOf="@+id/exo_next"        app:layout_constraintStart_toEndOf="@id/exo_pause" />    :id="@id/exo_next"        style="@style/ExoMediaButton.Next"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toEndOf="@id/exo_fullscreen_button"        app:layout_constraintStart_toEndOf="@+id/exo_ffwd" />    :id="@+id/exo_fullscreen_button"        style="@style/ExoMediaButton.Pause"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/exo_icon_fullscreen_enter"        app:layout_constraintBottom_toTopOf="@id/exo_position"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintStart_toEndOf="@id/exo_next" />    :id="@+id/exo_position"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintLeft_toLeftOf="parent" />    :id="@+id/exo_progress"        android:layout_width="0dp"        android:layout_height="wrap_content"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintLeft_toRightOf="@id/exo_position"        app:layout_constraintRight_toLeftOf="@+id/exo_duration"        app:unplayed_color="@android:color/black" />    :id="@+id/exo_duration"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintRight_toRightOf="parent" />        >

4. Activity代码

package com.example.myexoplayer;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.ImageButton;import com.google.android.exoplayer2.SimpleExoPlayer;import com.google.android.exoplayer2.source.MediaSource;import com.google.android.exoplayer2.source.ProgressiveMediaSource;import com.google.android.exoplayer2.ui.PlayerView;import com.google.android.exoplayer2.upstream.DataSource;import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;import com.google.android.exoplayer2.util.Util;public class MainActivity extends AppCompatActivity {    private PlayerView playerView;    private SimpleExoPlayer player;    private Context context = MainActivity.this;    private ImageButton imageButtonFullScreen;    private Boolean isFullScreen = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏标题 //这行代码一定要在setContentView之前,不然会闪退        setContentView(R.layout.activity_main);        imageButtonFullScreen = findViewById(R.id.exo_fullscreen_button);        imageButtonFullScreen.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int flagsFullScreen = WindowManager.LayoutParams.FLAG_FULLSCREEN;                if(isFullScreen) {                     getWindow().addFlags(flagsFullScreen); // 设置全屏                    //如果上面的不起作用,可以换成下面的。                    if (getSupportActionBar()!=null) getSupportActionBar().hide();    //应用标题栏                    isFullScreen = false;                }else { //退出全屏                    WindowManager.LayoutParams attrs = getWindow().getAttributes();                    attrs.flags &= (~flagsFullScreen);                    getWindow().setAttributes(attrs);                    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);                    if (getSupportActionBar()!=null) getSupportActionBar().show();    //应用标题栏                    isFullScreen = true;                }            }        });        playerView = findViewById(R.id.exo_player);        initializePlayer();    }    private void initializePlayer() {        player = new SimpleExoPlayer.Builder(context).build();        playerView.setPlayer(player);        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,                Util.getUserAgent(context,"myExoPlayer"));        MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)                .createMediaSource(Uri.parse(Environment.getExternalStorageDirectory() + "/1.mp4"));        player.prepare(mediaSource);    }    @Override    public void onBackPressed() {        super.onBackPressed();        player.release();    }}

5. 主要代码

全屏

requestWindowFeature(Window.FEATURE_NO_TITLE); // 隐藏标题 //这行代码一定要在setContentView之前,不然会闪退int flagsFullScreen = WindowManager.LayoutParams.FLAG_FULLSCREEN;getWindow().addFlags(flagsFullScreen); // 设置全屏//如果上面的不起作用,可以换成下面的。if (getSupportActionBar()!=null) getSupportActionBar().hide();    //应用标题栏

退出全屏

WindowManager.LayoutParams attrs = getWindow().getAttributes();attrs.flags &= (~flagsFullScreen);getWindow().setAttributes(attrs);getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);if (getSupportActionBar()!=null) getSupportActionBar().show();    //应用标题栏

初始化播放器

private void initializePlayer() {        player = new SimpleExoPlayer.Builder(context).build();        playerView.setPlayer(player);        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,                Util.getUserAgent(context,"myExoPlayer"));        MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)                .createMediaSource(Uri.parse(Environment.getExternalStorageDirectory() + "/1.mp4"));        player.prepare(mediaSource);    }

参考链接:
https://exoplayer.dev/ui-components.html
https://blog.csdn.net/qq_34902522/article/details/78550625
https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/ui/PlayerControlView.html

更多相关文章

  1. Android学习知识点之相对布局
  2. Android TableLayout表格布局
  3. AndroidManifest.xml中一些权限配置
  4. 布局 遗忘 整理
  5. Android 的一些比较好的开源代码项目
  6. 安卓相对布局
  7. Android基本布局案例(2)

随机推荐

  1. html标签01
  2. 6.)PHPWeb开发框架~laravel几种启动方式介
  3. 5.)PHPWeb开发框架~laravel目录结构分析
  4. 4.)PHPWeb开发框架~直接下载方式部署larav
  5. 3.)PHPWeb开发框架~使用composer管理工具
  6. 2.)PHPWeb开发框架~Laravel的开发环境配置
  7. 1.)PHPWeb开发框架~Laravel框架的简介(简洁
  8. 《GB/T700-2006》PDF下载
  9. TF卡出现“分区变0字节”的解决办法
  10. 4.27 定界符与运算流程控制