依赖原生实现的Android播放器

102 阅读1分钟
package com.anything.sample;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.File;

public class SurfaceViewDemo2 extends SurfaceView implements SurfaceHolder.Callback{
    private SurfaceHolder mSurfaceHolder;
    private MediaPlayer mediaPlayer;

    public SurfaceViewDemo2(Context context) {
        this(context,null,0);
    }

    public SurfaceViewDemo2(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SurfaceViewDemo2(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        setFocusable(true);
        setFocusableInTouchMode(true);
        this.setKeepScreenOn(true);
        setZOrderOnTop(true);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.i("guohao","=========surfaceCreated========");
        //start_pause_switch(); //自动播放
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.i("guohao","=========surfaceChanged========");
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i("guohao","=========surfaceDestroyed========");
        if (mediaPlayer != null ){
            stop();
        }
    }


    protected void stop() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    protected void play() {
        String path = "/storage/emulated/0/Movies/weiboIntl_video/4575226783080890_weibo.mp4";
        File file = new File(path);
        if (!file.exists()) {
            return;
        }
        try {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            // 设置播放的视频源
            //mediaPlayer.setDataSource(file.getAbsolutePath()); // 这个会遇到权限问题
            mediaPlayer.setDataSource(getContext(), Uri.parse("content://media/external/video/media/126591"));
            // 设置显示视频的SurfaceHolder
            mediaPlayer.setDisplay(getHolder());

            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                @Override
                public void onPrepared(MediaPlayer mp) {
                    Log.i("guohao","分辨率:" + mp.getVideoWidth() + "x" + mp.getVideoHeight());
                    Log.i("guohao","时长:" + mp.getDuration());
                    Log.i("guohao","开始播放");
                    mediaPlayer.start();
                }
            });
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    replay();
                }
            });

            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    play();
                    return false;
                }
            });
            // 监听进度
            new Thread() {
                @Override
                public void run() {
                    try {
                        while (true) {
                            // 如果正在播放,没0.5.毫秒更新一次进度条
                            int current = mediaPlayer.getCurrentPosition();
                            Log.i("guohao","CurrentPosition() = " + current);
                            sleep(500);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void replay() {
        if (mediaPlayer!=null){
            mediaPlayer.start();
        }else{
            play();
        }
    }

    // 供外部调用
    public void play_or_pause() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        }else if(mediaPlayer != null){
            mediaPlayer.start();
        }else{
            new Thread(new Runnable() {
                @Override
                public void run() {
                    play();
                }
            }).start();
        }
    }
}