【问题标题】:How do use a MediaPlayer to a SurfaceView in a Fragment如何在片段中使用 MediaPlayer 到 SurfaceView
【发布时间】:2018-05-04 18:58:59
【问题描述】:

因为我希望能够传递播放视频的 MediaPlayer,所以我想在播放视频的片段中使用 SurfaceView 而不是 VideoView。

我查看了关于如何将 MediaPlayer 附加到 SurfaceView 的 earlier question。问题的答案告诉我创建两个函数:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_player);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    mPreview = (SurfaceView)findViewById(R.id.surfaceView);
    holder = mPreview.getHolder();
    holder.setFixedSize(800, 480);
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mp = new MediaPlayer();
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mp.setDisplay(holder);
    play();
}

不幸的是,我无法通过 Fragment 覆盖 surfaceCreated,因为 Fragment 没有该方法。我还能将 MediaPlayer 附加到 Fragment 中的 SurfaceView 吗?

【问题讨论】:

  • 您链接的示例中的Activity 具有surfaceCreated() 方法,因为它是implements SurfaceHolder.Callback。你可以对你的 Fragment 类做同样的事情。
  • 按照@MikeM. 的建议,让您的Fragment 实现SurfaceHolder.Callback

标签: android android-fragments android-mediaplayer android-video-player


【解决方案1】:

使用回调侦听器将 Surface View 从 Fragment 传递给父 Activity,然后将 Media Player 从 Activity 附加到 Surface View,然后更新 Fragment Surface View、演示代码、IN Fragment

      SurfaceView mPreview ;

  private MyListener mylistener=null;
  public interface MyListener extends EventListener{
     void onPassSurface(SurfaceView surfaceview);
    }

   public void setListener (MyListener listener)
     {
        mylistener = listener;
      }

     public void updateSurfaceView(SurfaceView surfaceview)
      {
                  mPreview=surfaceview;

                 }

     mPreview =  (SurfaceView)findViewById(R.id.surfaceView);

     mylistener.onPassSurface(mPreview);

在活动中

    MyFragment  myfragment=new MyFragmment();
    myfragment.setListener(new MyFragment.MyListener)
     {
       @Override
       void onPassSurface(SurfaceView mPreview)
         {
            //attach Media Player Here or Write Method to attach
            //media player with Surface View and Call from Here

            //after attaching media player call this method
              myfragment.updateSurfaceView(mPreview);
            }

【讨论】:

  • 从干净代码的角度来看,最好Activity不需要与Fragment中的MediaPlayer有任何关系。您是否认为不向活动添加代码就无法做到这一点?
  • 不,你可以在 Fragment 中实现 SurfaceHolder.Callback 来覆盖surfaceCreated
  • 尝试在fragment中实现SurfaceHolder.Callback,然后可以覆盖SurfaceCreated
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多