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:
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 to share
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 to share