安卓视频播放器
磨洋工磨了好久,终于决定开始写视频播放器了,嗯,相册播放器那里,就是典型的旧坑未填,又挖新坑,233.再辞给自己立一个flag,一个月之后就要完成基本上的功能,比如基本的显示,自动播放了,上一个下一个,暂停开始,拖拉,视频列表。嗯,其他的慢慢来,总是要有个目标的,都没人管我,自己再不管自己就要废了。
嗯,时间真的是飞快哇,我都上班半年啦,清楚的记得,那天过来面试的时候,上午,小雨,打着伞,然后那天还很可怜的,到了公司早饭还没吃,站在公司外面吃包子,打电话跟人事说到了。穿的风衣T恤牛仔裤,嗯,填简历,等待,老大询问,老老大询问,工资,就完了,然后就是回去,终于不用跟耗子玩啦,(干哕),然后周一拖着行李箱,大件小件,也是下雨,打伞就拿不到行李,所以没打伞,心拔凉拔凉,走到公租房第一句是,这里没耗子吧,哈哈,被吓出阴影。就这样,过了半年,不能咸啊,要废,想一想,当初是怎么说的。现在就知道该怎么做了。加油哇皮皮虾。
嗯,这两天做了一个,关于天气的数据的整理,耽误了一点时间(虽然没人看233),后面会把他写出来,继续写视频吧。
18-10-29
昨天去做了头发,车祸现场了解一下。
视频现在可以实现基本的,暂停播放,上一首下一首,自动循环播放,以及seekbar的实时刷新。拖拉那里还有点问题。
嗯,重新写过......
现在差不多一个月,基本实现了以上说过的功能。
代码:
我一运行就会进到这个方法里面,显示第一个视频。
/**
* /storage/USB0/video/双笙 - 故梦.mp4
*/
private VideoView mVideoView;
private List<VideoFileInfo> videoLists = new ArrayList<VideoFileInfo>();// 新集合,集合记得new,不要犯这种傻错误啦
private int currentVideoIndex = 0;// 当前视频下标
private int allTime;// 当前视频总时间
// 操作视频
public void PlayVideoView() {
// 获取pointerObject中的视频资源
try {
List<FileVideoInfo> fileVideoList = pointerObject.getVideoItems();
for (FileVideoInfo fileVideoInfo : fileVideoList) {
// 把数据添加到VideoFileInfo里面,里面的属性可用的多一点
VideoFileInfo vinfo = new VideoFileInfo(fileVideoInfo.getPath());
videoLists.add(vinfo);
}
mVideoView.setVideoPath(videoLists.get(0).getPath());
} catch (RemoteException e) {
e.printstacktrace();
}
}
采用handler做循环刷新界面ui+thread做延迟操作。(以前用的是蠢handler发送消息,但是播放下一首的时候会出现同事发送两次的错误并且改不过来,所以改用handler+thread)。
需要注意的是:这里我用来做刷新页面时间数据的是now_tv,是先自增之后再使用的,视频需要从00:00开始,所以需要设置now_tv的值的地方都设置成了-1,自增过后就是0了。但是,不知道为什么,经常会有,textview显示视频剩两三秒才结束,实际播放的视频就已经结束了。
// thread+handler
int cprogress;
int now_tv = -1;
Thread mThread = new Thread(new Runnable() {
@SuppressWarnings("static-access")
@Override
public void run() {
sb_progress.setProgress(10);
try {
while (isExit) {
if (isPrepared) {
/**
* 1、在子线程死循环获取视频时长并发送给handler,handler执行ui更新操作,
*/
allTime = mVideoView.getDuration();
message msg = mHandler.obtainMessage(0, allTime / 1000);// what,obj
mHandler.sendMessage(msg);
}
mThread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
switch (msg.what) {
case 0:
if (!isPausing) {// 如果是暂停的就不做刷新操作
// 更新ui
now_tv++;
if (now_tv <= integer.parseInt(msg.obj + "")) {
sb_progress.setProgress(now_tv);
refereshTime(tv_now_time, now_tv);
}
// 正常播放的时候就把isCompletion = false;
isCompletion = false;
}
break;
default:
Log.e(TAG, "switch default ERROR");
break;
}
}
};
seekbar的监听事件,需要注意的是:这里的seekto的值是ms(毫秒),所以*1000就正常了,之前我就是不知道这个,所以一直直接seekto(progress),所以导致每一次跳转的时候都是跳到很前面,直到今天看见一个大佬说了,seekto是毫秒,之前自己在安卓开发api里面也没看到这个点。
// seekBar监听事件
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
now_tv = progress;
// 将seekBar设置到拖动的位置去
sb_progress.setProgress(progress);
Log.d(TAG, ".............progress:" + progress);
// 将mVideoView定位到seekBar拖动的位置,参数是毫秒!
mVideoView.seekTo(progress * 1000);
}
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
监听是否播放完毕,是安卓主线程中自己一直在做的事情,以前自己还傻傻的自己去循环判断是否播放完毕,,
@Override
public void onCompletion(mediaplayer arg0) {
isCompletion = true;
sb_progress.setProgress(0);
mVideoView.setVideoPath(videoLists.get(
++currentVideoIndex % videoLists.size()).getPath());// 担心下一个超出计划范围??当然还是取模好用哇
// 播放完成,将now_tv=0
now_tv = -1;
}
监听视频资源知否准备好,这个也是安卓主线程自己一直 在做的事情。每一次准备好之后就可以获取到新的视频的时长。
@Override
public void onPrepared(MediaPlayer arg0) {
// 准备好就开始
mVideoView.start();
// 获取视频总时长
allTime = mVideoView.getDuration() / 1000;// s
// 设置seekbar的最大值
sb_progress.setMax(allTime);
// 设置文本框
refereshTime(tv_all_time, allTime);
isPrepared = true;
}
点击上一个下一个以及播放暂停,没什么好说的,就是++--和start和pause,这里我只给暂停播放还了图片,上一个下一个这里仔细一点的也可以在按下的时候换一张图片
// 上一个
public void onClickPre(View arg0) {
Log.d(TAG, "-------------onClickPre---------------");
now_tv = -1;
// 点击下一个开始播放
isPausing = false;
bt_play.setBackground(getresources().getdrawable(R.drawable.play));
try {
if (currentVideoIndex <= 0) {
currentVideoIndex = videoLists.size() - 1;
mVideoView.setVideoPath(videoLists.get(
currentVideoIndex % videoLists.size()).getPath());
} else {
mVideoView.setVideoPath(videoLists.get(
--currentVideoIndex % videoLists.size()).getPath());
}
} catch (Exception e) {
Log.e(TAG, "onClickPre error");
}
}
// 下一个
public void onClickNext(View arg0) {
Log.d(TAG, "-------------onClickNext---------------");
now_tv = -1;
// 点击下一个开始播放
isPausing = false;
bt_play.setBackground(getResources().getDrawable(R.drawable.play));
sb_progress.setProgress(0);
mVideoView.setVideoPath(videoLists.get(
++currentVideoIndex % videoLists.size()).getPath());
}
// 播放暂停
@SuppressLint("NewApi")
public void onClickPlay(View arg0) {
if (!isPausing) {// 点击播放,变成暂停
mVideoView.pause();
isPausing = true;
bt_play.setBackground(getResources().getDrawable(R.drawable.pause));
} else {// 点击暂停,变成播放
isPausing = false;
bt_play.setBackground(getResources().getDrawable(R.drawable.play));
mVideoView.start();
}
}
到这里及可以实现:上一个,下一个,暂停,播放,seekbar跳转视频了。
后面还要慢慢实现:点击视频视频缩小,显示视频目录,点击视频名称开始播放对应视频;一段时间不操作,视频又恢复大小,以及隐藏seekbar和几个按钮;还可以实现一个拖动的时候seekbar那里显示一个当前拖动到的值的数据;
相关阅读
Google Scholar 无法访问记录(诡异的问题,安卓手机可以,
问题描述: 使用Shadowsocks代理,自己的VPS,效果很好,YouTube,Google等都没问题。一年前学校里修复过https://scholar.google.com/无法
从0开始 开发一个属于自己的桌面程序 最近在开发一个新项目,需要把应用改成桌面,并引导用户设置为默认桌面,完成后的效果如下图:
插件效果如图所示:使用:引入:在build.gradle中添加 implementation 'com.prolificinteractive:material-calendarview:1.4.0';应用
安卓Activity 跳转的标记深度思考FLAG_ACTIVITY_NEW_T
知识储备参考地址:http://blog.csdn.net/ljz2009y/article/details/26621815 FLAG_ACTIVITY_NEW_TASK标记了FLAG_ACTIVITY_NEW_TA
TLV格式及编码https://blog.csdn.net/defeny/article/details/53144535/* renamed from: oicq.wlogin_sdk.request.l */image.p