Android视频播放器ExoPlayer全屏

Android视频播放器ExoPlayer全屏

布局添加全屏按键

1. app gradle

dependencies {

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

android {

compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
    }

2. AndroidManifest配置权限

权限

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

屏幕允许翻转

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

3. activity布局

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

<com.google.android.exoplayer2.ui.PlayerView
        android: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"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns: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">

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <ImageButton
        android: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" />

    <TextView
        android:id="@+id/exo_position"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent" />

    <com.google.android.exoplayer2.ui.DefaultTimeBar
        android: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" />

    <TextView
        android:id="@+id/exo_duration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent" />
        
</androidx.constraintlayout.widget.ConstraintLayout>

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

发布了20 篇原创文章 · 获赞 4 · 访问量 5836

猜你喜欢

转载自blog.csdn.net/greatyoulv/article/details/104023467