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自带的图标集合
  3. AndroidManifest.xml中一些权限配置
  4. EditText的一些使用注意点
  5. Android(安卓)NDK应用开发
  6. [Android]Android(安卓)manifest 属性说明
  7. spring-android的使用
  8. [Android]Android(安卓)manifest 属性说明
  9. Android支持不同的密度或分辨率

随机推荐

  1. Android(安卓)横竖屏切换
  2. Android中几种图像特效处理
  3. E/错误(3907): android.view.ViewRootImp
  4. Android实时直播,一千行java搞定不依赖jni
  5. Android(安卓)调用谷歌语音识别
  6. golang开发android应用(一) - go语言androi
  7. Android(安卓)国际化button以及tablayout
  8. unity与Android之间的简单交互
  9. Google地图小示例框架
  10. Android(安卓)WiFiDirect 学习(二)——Serv