Android视频播放器ExoPlayer全屏
16lz
2021-01-23
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
更多相关文章
- Android学习知识点之相对布局
- Android TableLayout表格布局
- AndroidManifest.xml中一些权限配置
- 布局 遗忘 整理
- Android 的一些比较好的开源代码项目
- 安卓相对布局
- Android基本布局案例(2)