bundle配置:
implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.8.1'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.1'
show Dialogfragment:
Fragment prev = getCurrentActivity().getFragmentManager().findFragmentByTag("VideoDialogFragment");
if(prev!=null){
DialogFragment diaFragment = (DialogFragment)prev;
diaFragment.dismiss();
}
VideoPlayerFragment dialogFragment = new VideoPlayerFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("videoUrl",视频地址);
bundle.putSerializable("videoName",视频名字);
dialogFragment.setArguments(bundle);
dialogFragment.show(getCurrentActivity().getFragmentManager(), "VideoDialogFragment");

DialogFragment:
public class VideoPlayerFragment extends DialogFragment {
private ImageView screenImageView;
private ImageView changeVoiceView;
private TextView textVideoName;
private LinearLayout mainVideoLayout;
private LinearLayout videoLayout;
private Window window;
private Dialog dialog; private String videoUrl = null;
private String videoName = null;
private boolean isAllScreen = false;
private boolean isOpenSound = true;
private boolean isVideoMode = false;
private int resumeWindow;
private long resumePosition;
private int videoScreenWidth;
private int videoScreenHeight; private static Handler handler = new Handler();
private SimpleExoPlayerView simpleExoPlayerView;
private BandwidthMeter bandwidthMeter;
private TrackSelection.Factory videoTrackSelectionFactory;
private TrackSelector trackSelector;
private SimpleExoPlayer player; @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initPlayer();
} private void initPlayer() {
Common.silentSwitch(true);
bandwidthMeter = new DefaultBandwidthMeter();//创建带宽
videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);//创建轨道工厂
trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);//创建轨道选择器实例
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.VideoTheme);
if (ScreenUtils.isLandscape()) {
videoScreenWidth = 900;
videoScreenHeight = 620;
} else {
videoScreenWidth = 880;
videoScreenHeight = 1564;
}
} @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_exo_player, container);
Bundle bundle = getArguments();
if (bundle != null) {
videoUrl = (String) bundle.getSerializable("videoUrl");
videoName = (String) bundle.getSerializable("videoName");
isVideoMode = (Boolean) bundle.getSerializable("isVideoMode");
} dialog = getDialog();
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true); window = dialog.getWindow();
window.setBackgroundDrawableResource(android.R.color.transparent);
window.getDecorView().setPadding(0, 0, 0, 0);
//获得窗体的属性
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.CENTER;
lp.width = videoScreenWidth;
lp.height = videoScreenHeight;
window.setAttributes(lp); initView(view);
openPlayer(view);
startPlayer();
return view;
} private void initView(View view) {
simpleExoPlayerView = (SimpleExoPlayerView) view.findViewById(R.id.simpleExoPlayerView);
screenImageView = (ImageView) view.findViewById(R.id.btnAllScreen);
mainVideoLayout = (LinearLayout) view.findViewById(R.id.mainVideoLayout);
videoLayout = (LinearLayout) view.findViewById(R.id.videoLayout);
textVideoName = (TextView) view.findViewById(R.id.videoName);
if (!TextUtils.isEmpty(videoName)) {
textVideoName.setText("当前正在播放:" + videoName);
}
if (isVideoMode) {
screenImageView.setEnabled(false);
} else {
screenImageView.setEnabled(true);
}
changeVoiceView = (ImageView) view.findViewById(R.id.btnChangeVoice);
changeVoiceView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isOpenSound) {
changeVoiceView.setImageResource(R.drawable.mute_btn);
Common.silentSwitch(isOpenSound);
isOpenSound = false; } else {
changeVoiceView.setImageResource(R.drawable.voice_btn);
Common.silentSwitch(isOpenSound);
isOpenSound = true;
}
}
});
screenImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isAllScreen) {
window = dialog.getWindow();
//获得窗体的属性
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.CENTER;
lp.width = videoScreenWidth;
lp.height = videoScreenHeight;
window.setAttributes(lp);
screenImageView.setImageResource(R.drawable.allscreen_btn);
//videoLayout.setLayoutParams(new FrameLayout.LayoutParams(1000, 600));
isAllScreen = false;
} else {
screenImageView.setImageResource(R.drawable.cancelscreen_btn);
window = dialog.getWindow();
//获得窗体的属性
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.CENTER;
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
window.setAttributes(lp);
//videoLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT));
isAllScreen = true;
}
}
});
} private void openPlayer(View view) {
//创建播放器
player = ExoPlayerFactory.newSimpleInstance(view.getContext(), trackSelector);
//创建加载数据的工厂
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(view.getContext(),
Util.getUserAgent(view.getContext(), "com.reactnativedemo"), (TransferListener<? super DataSource>) bandwidthMeter); //创建解析数据的工厂
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
//传入Uri、加载数据的工厂、解析数据的工厂,就能创建出MediaSource
String url = videoUrl;
Uri mp4VideoUri = Uri.parse(url);
MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,
dataSourceFactory, extractorsFactory, null, null);
//循环播放
LoopingMediaSource loopingMediaSource = new LoopingMediaSource(videoSource);
player.prepare(loopingMediaSource);
player.addListener(eventListener);
player.setPlayWhenReady(true);
} private ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() {
@Override
public void onTimelineChanged(Timeline timeline, Object o, int i) { } @Override
public void onTracksChanged(TrackGroupArray trackGroupArray, TrackSelectionArray trackSelectionArray) { } @Override
public void onLoadingChanged(boolean b) { } @Override
public void onPlayerStateChanged(boolean b, int i) { } @Override
public void onRepeatModeChanged(int i) { } @Override
public void onShuffleModeEnabledChanged(boolean b) { } @Override
public void onPlayerError(ExoPlaybackException e) {
if (player != null) {
player.stop();
player.release();
player = null;
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("VideoDialogFragment");
if (prev != null) {
ft.remove(prev);
}
} @Override
public void onPositionDiscontinuity(int i) { } @Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) { } @Override
public void onSeekProcessed() {
}
}; private void startPlayer() {
simpleExoPlayerView.setPlayer(player);
//player.setPlayWhenReady(true);
} @Override
public void onAttach(Context context) {
super.onAttach(context);
} @Override
public void onResume() {
super.onResume();
if (player != null && player.getCurrentPosition() > 0) {
player.setPlayWhenReady(true);
player.seekTo(resumePosition);
}
} @Override
public void onPause() {
super.onPause();
if (player != null && player.getPlayWhenReady()) {
resumeWindow = player.getCurrentWindowIndex();
resumePosition = Math.max(0, player.getContentPosition());
player.setPlayWhenReady(false);
}
} @Override
public void onDestroyView() {
super.onDestroyView();
//释放播放器
if (player != null) {
player.stop();
player.release();
player = null;
}
} @Override
public void onDestroy() {
super.onDestroy();
silentSwitch(false);
}
}
public static void silentSwitch(boolean isOpenVoice) {
try {
AudioManager mAudioManager = (AudioManager) context.getSystemService(Service.AUDIO_SERVICE);
if (mAudioManager != null) {
if (isOpenVoice) {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
} else {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 100, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
}
}
} catch (Exception e) { }
}
<style name="VideoTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@style/dialogAnim</item>
</style>
转载请注明地址
本文参考:https://www.jianshu.com/p/628481250b59
https://blog.csdn.net/dianziagen/article/details/82258356
https://blog.csdn.net/qq_34902522/article/details/78550625

android,Exoplayer实现视频播放器的更多相关文章

  1. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  2. 分享几个不错的Android开源音视频播放器

    整理了一下Github上几个开源的音视频播放器项目,有兴趣的同学可以clone代码去研究学习.   UniversalMusicPlayer https://github.com/googlesamp ...

  3. 一些不错的Android开源音视频播放器

    摘要:来自Github上的一点点整理,希望对你有用! 整理了一下Github上几个开源的音视频播放器项目,有兴趣的同学可以clone代码去研究学习. 1.UniversalMusicPlayer ht ...

  4. Android 视频播放器 (四):使用ExoPlayer播放视频

    一.简介 ExoPlayer是一个Android应用层的媒体播放器,它提供了一套可替换Android MediaPlayer的API,可以播放本地或者是线上的音视频资源.ExoPlayer支持一些An ...

  5. Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目

    简单的说下一Android的几种视频播放功能: 1.VideoView:最简单的视频播放 <FrameLayout xmlns:android="http://schemas.andr ...

  6. Android 视频播放器切换到下个视频时残留上个视频画面的解决办法

    最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面.   这是怎么回事?   我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...

  7. android视频播放器开发

    http://blog.csdn.net/u010181592/article/details/49301703 http://blog.csdn.net/qq_33291295/article/de ...

  8. Android(java)学习笔记243:多媒体之视频播放器

    1.这里我们还是利用案例演示视频播放器的使用: (1)首先,我们看看布局文件activity_main.xml,如下: <RelativeLayout xmlns:android="h ...

  9. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

随机推荐

  1. STM32基础分析——PWM配置

    在使用STM32F103产生固定频率.固定占空比的PWM波时,虽然有官方以及众多开发板提供的例程,但是关于有点问题并没有说的很清晰,并且<STM32F10X参考手册>的中文翻译可能容易造成 ...

  2. mac 添加环境变量

    1.Mac系统的环境变量,加载顺序为: a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile ...

  3. LeetCode记录之20——Valid Parentheses

    09.18更新算法采用栈的思想解决,方法①所示. 本题主要是找是否有匹配的字符串,因为还没有复习到栈之类的知识点,只能还是采用暴力方法了,后期会补上更加优化的算法.我的思路就是先遍历一遍找是否有匹配的 ...

  4. 【算法笔记】B1021 个位数统计

    1021 个位数统计 (15 分) 给定一个 k 位整数 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​> ...

  5. Java调度线程池ScheduleExecutorService

    如果在一个ScheduleExecutorService中提交一个任务,这个任务的调度周期设置 的时间比任务本身执行的时间短的话会出现什么情况?也就是在线程调度时间已经到了 但是上次的任务还没有做完的 ...

  6. JAVA实体类不要使用基本类型,基本类型包含byte、int、short、long、float、double、char、boolean

    由于JAVA的基本类型会有默认值,例如当某个类中存在private  int age;字段时,创建这个类时,age会有默认值0.当使用age属性时,它总会有值.因此在某些情况下,便无法实现age为nu ...

  7. Linux下jenkins改端口、解决内存溢出、版本升级

    1.新版本的jenkins修改端口新版本jenkins的配置文件在/etc/sysconfig/jenkinsvi /etc/sysconfig/jenkins找到JENKINS_PORT=" ...

  8. oracle 基础知识(二)-表空间

    一,表空间 01,表空间? Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表.有了数据库,就可以创建表空间.表空间(tablespace)是数据库 ...

  9. QT跟VC++结合来进行插件的验证机制

    由于最近公司要开发一个以C++插件机制为主的,主要有一个问题就是C++的二进制兼容性的问题.一旦类使用虚函数,只要随便改动下增删查改下头文件的虚函数,就会导致程序在跑的时候进行乱跳,因为这个时候exe ...

  10. ife task0003学习笔记(二):JavaScript原型

    function aaa(){} aaa.prototype.bbb=function(){} var obj1=new aaa() var obj2=new aaa() obj1和obj2都有一个属 ...