Can SurfaceView be reused after MediaPlayer.release ()?

Let's assume we have the following (from Android ApiDemos):

<?xml version="1.0" encoding="utf-8"?>

      

<SurfaceView android:id="@+id/surface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
</SurfaceView>

      

After the MediaPlayer uses the SurfaceView and its release () is called, can the SurfaceView be reused? I tried to create a new MediaPlayer instance to reuse the SurfaceView, but the following error occurs in setDisplay (): java.lang.IllegalArgumentException: The surface has been thrown

The code looks like this:

    mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);

mMediaPlayer = new MediaPlayer();
MediaPlayer.setDataSource(url);

mMediaPlayer.setDisplay(holder);

      

+3


source to share


3 answers


try this:



    @Override
public void surfaceCreated(SurfaceHolder holder) {
    System.out.println("===== * surfaceCreated * =====");
    if(mMediaPlayer == null)
        mMediaPlayer = new MediaPlayer();
    mMediaPlayer .setDisplay(holder);
}

      

+2


source


try this:



mPreview  = (SurfaceView) findViewById(R.id.PlaySurfaceView);
surfaceHolder = mPreview.getHolder();
surfaceHolder.addCallback(this);
try {
 mMediaPlayer = new MediaPlayer();
 mMediaPlayer.setDataSource(url);  
 mMediaPlayer.setDisplay(holder); 
 } catch (IllegalArgumentException e1) {
     e1.printStackTrace();
   } catch (SecurityException e1) {
     e1.printStackTrace();
   } catch (IllegalStateException e1) {
     e1.printStackTrace();
   } catch (IOException e1) {
     e1.printStackTrace();
   }

      

0


source


I had this problem and solved it by adding release visible = go to surfaceview to my function:

  public void release() {
    if (mMediaPlayer != null) {
    setVisibility(View.GONE);
      mMediaPlayer.reset();
      mMediaPlayer.release();
      mMediaPlayer = null;
      mCurrentState = STATE_IDLE;}
  }

      

and set visible = visible in onprepared function:

   videoView.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                audio=false; video=false; int ty=mp.getTrackInfo().length;
                for (int i=0; i<ty;i++)
                {
                    if (mp.getAudioTrack()>-1) {audio=true;}
                    if (mp.getVideoTrack()>-1) {video=true;}
                }

                if (((audio==false)&&(skip==true))||((video==false)&&(skip2==true))||((video==true)&&(skip4==true))) 
                {   notifybar("...");
                    nexttr();} else {
                if (vis==true) {
                if (video==false) {
                    if (mVisualizerView.getVisibility()!=View.VISIBLE) {mVisualizerView.setVisibility(View.VISIBLE);}
                        mVisualizerView.link(videoView.getAudioSessionId());
                        vis2=true;
                        } else if (vis2==true){
                       mVisualizerView.release();
                       mVisualizerView.setVisibility(View.GONE);
                      vis2=false;
                        }}
                //this
                if (video==true) {
                if (videoView.getVisibility()!=View.VISIBLE) {videoView.setVisibility(View.VISIBLE);}
                } else {if (videoView.getVisibility()!=View.INVISIBLE) {videoView.setVisibility(View.INVISIBLE);}
                }

      

0


source







All Articles