具有SurfaceView的Android MediaPlayer在Prepare()方法上失败

时间:2018-11-08 01:58:51

标签: android android-mediaplayer surfaceview

我正在尝试使用表面视图和媒体播放器构建视频播放器。我的数据源是一个在线视频,并且我已在清单中启用了Internet权限。

但是,视频不收费,但会发出有关prepare方法的警告,而没有任何暗示如下问题的提示:

W/System.err:     at android.media.MediaPlayer._prepare(Native Method)
    at android.media.MediaPlayer.prepare(MediaPlayer.java:1188)
    at in.sashi.androidvideoplayer.MainActivity.surfaceCreated(MainActivity.java:64)

这是我用于此目的的代码:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener {

private static final String TAG = MainActivity.class.getSimpleName();

private SurfaceView surfaceView;
private ImageView playIV, backIV;
private TextView videoNameTV;

private MediaPlayer mediaPlayer;
private SurfaceHolder holder;

//    private static final String VIDEO_URL = "https://www.youtube.com/watch?v=vEVd0QMjCc8";
private static final String VIDEO_URL = "http://mic.duytan.edu.vn:83/FINAL.mp4";
private static final String VIDEO_NAME = "FALL HARDER | BASKETBALL MOTIVATION";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    init();

}

private void init() {
    surfaceView = findViewById(R.id.surfsceView);
    playIV = findViewById(R.id.playIV);
    backIV = findViewById(R.id.backIV);
    videoNameTV = findViewById(R.id.videoNameTV);

    videoNameTV.setText(VIDEO_NAME);

    backIV.setOnClickListener(this);
    playIV.setOnClickListener(this);

    holder = surfaceView.getHolder();
    holder.addCallback(this);

    surfaceView.setKeepScreenOn(true);
    mediaPlayer = new MediaPlayer();

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
    try {
        mediaPlayer.setDataSource(VIDEO_URL);
        mediaPlayer.prepare();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.backIV:
            onBackPressed();
            break;
        case R.id.playIV:
            if (mediaPlayer.isPlaying()){
                Log.d(TAG, "Pause Clicked");
                mediaPlayer.pause();
                playIV.setImageResource(R.drawable.play);
            } else {
                Log.d(TAG, "Play Clicked");
                mediaPlayer.start();
                playIV.setImageResource(R.drawable.pause);
            }
            break;
    }
}

@Override
protected void onPause() {
    super.onPause();
    collect();
}

private void collect() {
    if (mediaPlayer != null){
        mediaPlayer.release();
        mediaPlayer = null;
    }
}
}

有人可以帮我解决这个问题吗?谢谢。

2 个答案:

答案 0 :(得分:1)

使用正在全局定义的mediaplayer对象。

 @Override
 public void onPrepared(MediaPlayer mp) {
   mediaPlayer.start();
 }

答案 1 :(得分:0)

怎么样?

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
    try {
        mediaPlayer.setDataSource(VIDEO_URL);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }
}