Android Surface视图被破坏

时间:2016-07-01 10:45:35

标签: android android-mediaplayer surfaceview surfaceholder

我有一个列表视图,点击列表视图中的项目后会打开一个新活动。新活动的xml如下:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/youtube_layout"></RelativeLayout>

<SurfaceView

    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:visibility="gone"
    android:layout_height="match_parent" />

<WebView
    android:id="@+id/webView1"
    android:layout_below="@+id/rel"
    android:layout_width="match_parent"
    android:visibility="gone"
    android:layout_height="match_parent"
    />
</RelativeLayout>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/relativeLayout"
    android:layout_alignParentBottom="true">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnPrev"
        android:text="Previous Module"
        android:onClick="prev"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnNext"
        android:text="Next Module"
        android:onClick="next"
         />
 </RelativeLayout> 

取决于我发送的项目类型,它会打开活动。例如。如果我将项目名称作为视频发送,则会在活动中打开视频。单击下一个项目,它将显示列表的下一个项目。按下前一个按钮,它显示上一个项目。

我的问题是,当我点击列表中的视频项目时,它会显示我的视频。这工作正常。但是当我打开其他项目时说webview,并且点击下一个/上一个按钮后不播放视频。如果我放入日志,我可以看到表面视图已经创建,然后进入表面更改,它立即销毁并转到mediaplayer setOnCompletionListener。

        public void call(){
        webView.setVisibility(View.GONE);

        surfaceView.setVisibility(View.VISIBLE);
        youtube_layout.setVisibility(View.GONE);
        surfaceHolder=surfaceView.getHolder();
        surfaceHolder.addCallback(this);

        setController();
        pd=new ProgressDialog(this);
        pd.setMessage("Streaming...");
        pd.setIndeterminate(false);
        pd.setCancelable(true);}    
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //pd.dismiss();
    Log.d("mlearning", "surfaceChanged");
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    Log.d("mlearning", "surfaceDestroyed");
}

  private  void setController(){
  controller = new MediaController(this);
  controller.setPrevNextListeners(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    }, new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    controller.setMediaPlayer(this);
    controller.setAnchorView(findViewById(R.id.surfaceView));
    controller.setSaveEnabled(true);
    controller.setEnabled(true);


}   
@Override
public void surfaceCreated(SurfaceHolder holder) {
    pd.show();

    try{

        mediaPlayer=new MediaPlayer();
        mediaPlayer.setDisplay(surfaceHolder);
        mediaPlayer.setDataSource(url);//Url of the video
        mediaPlayer.setDisplay(holder);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {

                return false;
            }
        });

        mediaPlayer.prepareAsync();

        mediaPlayer.setOnPreparedListener(new  MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                if (isPaused) {
                    mediaPlayer.start();
                    mediaPlayer.seekTo(length);
                    isPaused = false;
                    pd.dismiss();

                } else {

                    mediaPlayer.start();
                    controller.show();
                    pd.dismiss();
                }

            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {}}

1 个答案:

答案 0 :(得分:0)

您可以在视图上动态添加曲面视图。

示例:layout.xml

<FrameLayout
    android:id="@+id/fragment_file_videoplayer_surface_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</FrameLayout>

MainActivity.java

FrameLayout fl_surfaceview_container = (FrameLayout)findViewById(R.id.fragment_file_videoplayer_surface_container);

//Add surfaceView on Framelayout
SurfaceView videoSurface = new SurfaceView(getActivity());
fl_surfaceview_container.addView(videoSurface);

//if remove or destroy surfaceview
fl_surfaceview_container.removeAllViews();