2012-03-20 99 views
0

我想使用mediaplayer的两个实例。当播放第一个实例时,第二个实例在另一个线程中准备好。当第一个实例完成文件时,第二个实例启动。视频不显示与媒体播放器的2个实例

问题:第二个实例只播放音频,视频不可见。

观察:如果我使用与第一个相同的曲面支架准备第二个实例,并在第一个实例完成后启动,它可以正常工作。 下面是代码

package com.THER; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import com.THER.MessengerServiceActivities.IncomingHandler; 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.os.RemoteException; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.VideoView; 
import android.widget.ViewSwitcher; 

public class MediaPlayerActivity extends Activity implements OnCompletionListener, Callback, OnPreparedListener { 

private MediaPlayer mMediaPlayer1 = null; 
    private SurfaceView mPreview1; 
    private SurfaceHolder holder1; 
    private ViewSwitcher switcher; 

    Integer counter = 0; 
    Integer played_files = 1; 
    private MediaPlayer mMediaPlayer2 = null; 
    private SurfaceView mPreview2; 
    private SurfaceHolder holder2; 
    boolean mIsBound; 
    boolean finish_flag = false; 
    /** Messenger for communicating with service. */ 
    Messenger mService = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     Intent intent; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.videoview); 
     doBindService(); 
     intent = getIntent(); 
     counter=intent.getIntExtra("counter",counter); 


     mPreview1 =(SurfaceView)findViewById(R.id.surfaceView1); 
     holder1 = mPreview1.getHolder(); 
     holder1.addCallback(this); 
     holder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     mPreview2 =(SurfaceView)findViewById(R.id.surfaceView2); 
     holder2 = mPreview2.getHolder(); 
     holder2.addCallback(this); 
     holder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     mMediaPlayer1 = new MediaPlayer(); 
     mMediaPlayer1.setScreenOnWhilePlaying(true); 
     mMediaPlayer2 = new MediaPlayer(); 
     mMediaPlayer2.setScreenOnWhilePlaying(true); 
     try { 

       mMediaPlayer1.setDataSource("/sdcard/1.mp4"); 
       mMediaPlayer1.setDisplay(holder1); 

      } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
        // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



     mMediaPlayer1.setOnCompletionListener(this); 
     mMediaPlayer1.setOnPreparedListener(this); 
     //mMediaPlayer2.setOnPreparedListener(this); 
     mMediaPlayer2.setOnCompletionListener(this); 




     } 
    private class MediaPlayerTask extends AsyncTask<MediaPlayer, Void, String> implements OnCompletionListener { 

      String file; 
      private SurfaceHolder holder; 
     @Override 
      protected String doInBackground(MediaPlayer... mp1) { 
       // TODO Auto-generated method stub 
      //mp1[0].reset(); 
      if(counter%2 == 0) 
      { 
       file = "/sdcard/2.mp4"; 
       holder = holder2; 
      } 
      else 
      { 
       file = "/sdcard/1.mp4"; 
       holder = holder1; 
      } 

      try { 

        mp1[0].reset(); 
        mp1[0].setDataSource(file); 
        mp1[0].setDisplay(holder); 
        mp1[0].prepare(); 
        mp1[0].setOnCompletionListener(this); 
        //mp1[0].start(); 

      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
      } 
     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 

     } 


} 



public void onCompletion(MediaPlayer mp) 
{ 

    if(counter%2 == 0) 
     { 
      played_files++; 
      mMediaPlayer1.stop(); 
      mMediaPlayer1.release(); 

      mMediaPlayer2.start(); 


     } 
     else 
     { 
      played_files++; 
      mMediaPlayer2.stop(); 
      mMediaPlayer2.release(); 

      mMediaPlayer1.start(); 

     } 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    try { 
     if(counter%2 == 0) 
     { 
      mMediaPlayer2.prepare(); 
     } 
     else 
     { 
      mMediaPlayer1.prepare(); 
     } 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 

public void onPrepared(MediaPlayer mp) { 
    // TODO Auto-generated method stub 
    //if(counter == 1) 
     mp.start(); 

} 

}

+0

是那两个'SurfaceView'在彼此的顶部,你忘记隐藏已完成或同时可见的一个,例如,并排? – zapl 2012-03-20 21:23:36

回答