ExoVideoView is based on ExoPlayer.
What's in ExoVideoView
1.Process AudioFocus automatically.
2.Process its orientation by sensor automatically
3.simple gesture action supported.
4.multiple video quality supported
5.you can add custom views to the default controller.
6.multiple resize-mode supported
7.custom controller supported.
8.change the widget's visibility if you like.
The easiest way to get started using ExoVideoView is to add it as a gradle dependency. You need to make sure you have the jitpack repositories included in the build.gradle file in the root of your project:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Next add a gradle compile dependency to the build.gradle file of your app module:
implementation 'com.github.JarvanMo:ExoVideoView:2.1.6'
Declare ExoVideoView in your layout file as :
<com.jarvanmo.exoplayerview.ui.ExoVideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="300dp"/>
ExoVideoView provides built-in Player
for convenience,so we can play a video as
SimpleMediaSource mediaSource = new SimpleMediaSource(url);//uri also supported
videoView.play(mediaSource);
videoView.play(mediaSource,where);//play from a particular position
Passing a player outside to ExoVideoView:
videoView.setPlayer(player);
Note:never forget to release ExoPlayer:
videoView.releasePlayer();
see details in demo.
The ExoVideoView can handle its orientation by sensor automatically only when ExoVideoVIew has a not-null OrientationListener :
videoView.setOrientationListener(orientation -> {
if (orientation == SENSOR_PORTRAIT) {
//do something
} else if (orientation == SENSOR_LANDSCAPE) {
//do something
}
});
NOTE:When the ExoVideoView handle its orientation automatically,The ExoVideoView will call
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE)
oractivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
if thecontext
in controller is an Activity. The fullscreen management is the same as orientation management.
First,override onKeyDown:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return videoView.onKeyDown(keyCode, event);
}
return super.onKeyDown(keyCode, event);
}
Then passing a backListener to ExoVideoView:
videoView.setBackListener((view, isPortrait) -> {
if (isPortrait) {
//do something
}
return false;
});
If return value is true
, operation will be interrupted.Otherwise,ExoVideoView handle its orientation by itself and OrientationLister.onOrientationChange()
will be caled.
ExoVideoView also provides a built-in multi-quality selector.The multi-quality selector
will be added to overlayFrameLayout
if multi-quality is enabled and ExoMediaSource
are given different qualities in current version.
List<ExoMediaSource.Quality> qualities = new ArrayList<>();
ExoMediaSource.Quality quality =new SimpleQuality(quality,mediaSource.url());
qualities.add(quality);
mediaSource.setQualities(qualities);
ExoVideoPlaybackController
are divided into four parts:
1.Top
2.Top Landscape
3.Bottom
4.Bottom Landscape
Each of them can be hidden or shown:
app:controller_display_mode="all|none|top|top_landscape|bottom|bottom_landscape"
in java:
videoView.setControllerDisplayMode(mode);
Views can be added to ExoVideoPlaybackController
in java.
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP, view);
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_TOP_LANDSCAPE, view);
videoView.addCustomView(ExoVideoPlaybackControlView.CUSTOM_VIEW_BOTTOM_LANDSCAPE, view);
Defining your own exo_video_playback_control_view.xml
is useful to customize the layout of ExoVideoPlaybackControlView
throughout your application. It's also possible to customize the layout for asingle instance in a layout file. This is achieved by setting the controller_layout_id attribute on a ExoVideoPlaybackControlView
. This will cause the specified layout to be inflated instead of code exo_video_playback_control_view.xml
for only the instance on which the attribute is set.
app:controller_layout_id="@layout/my_controller"
Sometimes,we may not like the back buttons.So let's hide it:
videoView.changeWidgetVisibility(R.id.exo_player_controller_back,View.INVISIBLE);
For more widgets you can hide or show,see IDS_IN_CONTROLLER.
NOTE:This is a dangerous operation because I don't know what will happen to the UI.
app:controller_background="@android:color/holo_orange_dark"
app:use_artwork="true"
app:default_artwork="@drawable/default_art"