import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import com.android.volley.VolleyLog;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by moziqi on 16-2-11.
*/
class VideoView extends SurfaceView implements
MediaPlayer.OnPreparedListener,
MediaPlayer.OnBufferingUpdateListener,
MediaPlayer.OnErrorListener,
MediaPlayer.OnCompletionListener,
SurfaceHolder.Callback {
private Context mContext;
private MediaPlayer mediaPlayer;
private SurfaceHolder surfaceHolder;
private SimpleDateFormat sdf;
private int currentPause = -1;
public VideoView(Context context) {
super(context);
init();
mContext = context;
}
public VideoView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
mContext = context;
}
public VideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
mContext = context;
}
/***
* 初始化
*/
public void init() {
surfaceHolder = this.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(320, 220);//显示分辨率
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//Surface类型
surfaceHolder.setKeepScreenOn(true);
mediaPlayer = new MediaPlayer();
sdf = new SimpleDateFormat("mm:ss");
}
/**
* 设置播放位置
*
* @param current
*/
public void setCurrentPause(int current) {
this.currentPause = current;
}
/**
* 获取当前时间
*
* @return
*/
public String getCurrentTime() {
String str = sdf.format(new Date(mediaPlayer.getCurrentPosition()));
return str;
}
/**
* 获取总时间
*
* @return
*/
public String getTotalTime() {
sdf = new SimpleDateFormat("mm:ss");
String str = sdf.format(new Date(mediaPlayer.getDuration()));
return str;
}
/**
* 设置URI
*
* @param uri
* @throws IOException
*/
public void play(Uri uri) throws IOException {
try {
mediaPlayer.reset();
if (currentPause > 0) {
mediaPlayer.seekTo(currentPause);
}
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDisplay(surfaceHolder);
mediaPlayer.setDataSource(mContext, uri);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
throw new IOException("uri error");
}
}
/**
* 暂停的时候记录位置
*/
public void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
currentPause = mediaPlayer.getCurrentPosition();
}
}
public void onDestroy() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
mediaPlayer = null;
}
@Override
public void onPrepared(MediaPlayer mp) {
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
StringBuilder errorLog = new StringBuilder();
errorLog.append("media error is ");
switch (what) {
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Toast.makeText(mContext, "手机不支持该视频格式,无法正常播放", Toast.LENGTH_SHORT).show();
errorLog.append("Unspecified media player error");
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
errorLog.append("Media server died");
break;
case MediaPlayer.MEDIA_ERROR_IO:
errorLog.append("File or network related operation errors");
break;
case MediaPlayer.MEDIA_ERROR_MALFORMED:
errorLog.append("Bitstream is not conforming to the related coding standard or file spec");
break;
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
errorLog.append("the media framework does not support the feature");
break;
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
errorLog.append("operation takes too long to complete");
break;
default:
errorLog.append("unkown error");
}
VolleyLog.e("%s", errorLog.toString());
return true;
}
@Override
public void onCompletion(MediaPlayer mp) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
转载于:https://my.oschina.net/moziqi/blog/614502