Darth Plagueris
Darth Plagueris

Reputation: 339

Android MediaPlayer with SurfaceView Fails on Prepare() Method

I am trying to build a video player using surface view and media player. My data source is an online video and I have enabled internet permission in manifest.

However, the video does not pay but throws a warning about prepare method without any hint at what the problem is like below:

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)

here's my code for this purpose:

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;
    }
}
}

Can anyone help me to figure this out? Thanks.

Upvotes: 0

Views: 621

Answers (2)

Ramesh Yankati
Ramesh Yankati

Reputation: 1217

Use mediaplayer object which is being defined globally.

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

Upvotes: 1

sso.techie
sso.techie

Reputation: 146

How about this?

@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();
    }
}

Upvotes: 0

Related Questions