videoView

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) {

    }

}


你可能感兴趣的:(videoView)