最近做一个项目,要求播放一个特定的网络视频,我用Android自带的MediaPlayer 与SurfaceView实现!其中有项要求,在播放的Activity切换到后台后,要求暂停播放,在切会前台后。恢复播放!我是在onStop() 中调用MediaPlayer.pause();在onStart()中根据记录的状态调用MediaPlayer.start();现在的问题是,在我恢复播放的时候,声音出来了,但是屏幕一直是黑屏!找了两天一直没有原因,那位大侠能给点提示!

解决方案 »

  1.   

    重新起来会走surfaceCreate,在这里面重绘
      

  2.   


    你没有监听callback。
    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;public class MainActivity extends Activity {
        private EditText nameText;
        private String path;
        private MediaPlayer mediaPlayer;
        private SurfaceView surfaceView;
        private boolean pause;
        private int position;
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            mediaPlayer = new MediaPlayer();
            nameText = (EditText) this.findViewById(R.id.filename);
            surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
            surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            surfaceView.getHolder().setFixedSize(176, 144);
            surfaceView.getHolder().setKeepScreenOn(true);
            surfaceView.getHolder().addCallback(new SurfaceCallback());
        }
        
        private final class SurfaceCallback implements Callback{
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    public void surfaceCreated(SurfaceHolder holder) {
    if(position>0 && path!=null){
    play(position);
    position = 0;
    }
    }
    public void surfaceDestroyed(SurfaceHolder holder) {
    if(mediaPlayer.isPlaying()){
    position = mediaPlayer.getCurrentPosition();
    mediaPlayer.stop();
    }
    }
        } @Override
    protected void onDestroy() {
         mediaPlayer.release();
         mediaPlayer = null;
    super.onDestroy();
    } public void mediaplay(View v){
         switch (v.getId()) {
    case R.id.playbutton:
    String filename = nameText.getText().toString();
    if(filename.startsWith("http")){
    path = filename;
    play(0);
    }else{
    File file = new File(Environment.getExternalStorageDirectory(), filename);
    if(file.exists()){
    path = file.getAbsolutePath();
    play(0);
    }else{
    path = null;
    Toast.makeText(this, R.string.filenoexsit, 1).show();
    }
    }

    break; case R.id.pausebutton:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.pause();
    pause = true;
    }else{
    if(pause){
    mediaPlayer.start();
    pause = false;
    }
    }
    break;

    case R.id.resetbutton:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.seekTo(0);
    }else{
    if(path!=null){
    play(0);
    }
    }
    break;
    case R.id.stopbutton:
    if(mediaPlayer.isPlaying()){
    mediaPlayer.stop();
    }
    break;
    }
        } private void play(int position) {
    try {
    mediaPlayer.reset();
    mediaPlayer.setDataSource(path);
    mediaPlayer.setDisplay(surfaceView.getHolder());
    mediaPlayer.prepare();//缓冲
    mediaPlayer.setOnPreparedListener(new PrepareListener(position));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    private final class PrepareListener implements OnPreparedListener{
    private int position;

    public PrepareListener(int position) {
         this.position = position;
    } public void onPrepared(MediaPlayer mp) {
    mediaPlayer.start();
    if(position>0) mediaPlayer.seekTo(position);
    }
    }
    }
      

  3.   


    非常感谢fangmingshijie 大牛。  帮我解决了这个问题。重点是 public void surfaceDestroyed(SurfaceHolder holder) {
                if(mediaPlayer.isPlaying()){
                    position = mediaPlayer.getCurrentPosition();
                    mediaPlayer.stop();

                }