最近项目中要用到视频播放器,就先写了个Demo,在写的过程中遇到些问题,来和大家分享一下:
1.Demo是基于Android电视的,因此与Android手机有点区别,但问题不大
2.MediaPlayer有个Bug,当视频播放完后getDuration(获取视频总时间)和getCurrentPosition(获取视频当前播放时间)方法获取到的数字不一样,相差300ms左右,如果单纯的播放不受影响,但是如果需要显示播放进度或播放时间就会有点小麻烦,暂时还没找到好的方法,只能在视频播放结束时处理时间,如果你们有好的方法也可以交流一下。
3.项目要实现显示当前时间的TextView与进度条同步移动,界面添加一个ViewGroup,然后在ViewGroup中放置TextView,通过TextView的Layout方法就能实现TextView的同步移动。
代码的解析挺详细,下面我就直接粘代码:
主Activity:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import com.example.play.R;
import com.luluvideo.view.TextMoveLayout;
import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private SurfaceView videoSurfaceView;// 视频播放器
private MediaPlayer mediaPlayer;// 视频播放控制器
private ImageView videoStart;// 播放
private ImageView videoForward;// 快进
private ImageView videoBack;// 快退
private ImageView videoReport;// 举报视频
private LinearLayout seekLayout;
private LinearLayout videoProgress;
private ProgressBar progressBar;// 视频进度条
private TextView totalTime;// 播放总时间
private View view;// 记忆获取焦点控件
private TextView movieName;// 电影名字
private TextView currentTime;// 当前播放时间
private ViewGroup.LayoutParams layoutParams;
private TextMoveLayout textMoveLayout;// 放置当前时间控件的ViewGroup
private int screenWidth;// 屏幕宽度
private Typeface roboto;// 自定义Roboto字体
private float moveStep = 0;// 当前时间控件移动步长
private SimpleDateFormat formatter;// 转换时间格式的类
private SimpleDateFormat hourFormatter;
private boolean isPlaying = true;// 视频播放状态标识
private boolean isVisible = false;// 视频进度条隐藏或显示标识
private boolean hourOrMin = false;
private boolean threadRunning = true;
private int postion = 0;
private String uri = null;
private AlphaAnimation animation_appear;// 进度条显现动画
private AlphaAnimation animation_daiappear;// 进度条消失动画
private float progressLength = 0;// 进度条相对长度
private Thread thread = null;
private MyTimerTask task;
public static int PROGRESS_VISUBLE = 0;
public static int PROGRESS_RATE = 1;
public int i = 0;
private Timer timer;
/**
* 刷新进度条和当前时间
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == PROGRESS_RATE) {
// 显示进度条
progressBar.setProgress((Integer) msg.obj);
// 设置当前时间
currentTime.layout((int) ((Integer) msg.obj * moveStep), 0,
(int) (screenWidth), 80);
if (hourOrMin) {
currentTime
.setText(hourFormatter.format((Integer) msg.obj));
} else {
currentTime.setText(formatter.format((Integer) msg.obj));
}
} else if (msg.what == PROGRESS_VISUBLE) {
Log.e("timer", msg.obj + "");
if ((Integer) msg.obj == 4) {
view = getCurrentFocus();
// videoProgress
// .setAnimation(animationAppear(animation_appear));
// videoProgress.setVisibility(View.GONE);
seekLayout.setAnimation(animationAppear(animation_appear));
seekLayout.setVisibility(View.GONE);
isVisible = false;
timer.cancel();
}
}
}
};
@Overr