Android MediaPlayer с SurfaceView не работает при методе Prepare () - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь построить видеоплеер, используя вид поверхности и медиаплеер. Мой источник данных - онлайн-видео, и я включил разрешение на доступ к Интернету в манифесте.

Тем не менее, видео не платит, но выдает предупреждение о методе 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 голосов
/ 08 ноября 2018

Использовать объект медиаплеера, который определяется глобально.

 @Override
 public void onPrepared(MediaPlayer mp) {
   mediaPlayer.start();
 }
0 голосов
/ 08 ноября 2018

Как насчет этого?

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