媒体控制器碎片

时间:2017-04-08 17:00:03

标签: android android-studio android-fragments media android-videoview

我正在尝试在Android工作室制作媒体控制器但是使用片段而不是活动,我使用下面的代码,但它给了我以下错误:

public class Tab1Helloworld extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1helloworld, container, false);
        return rootView;


        VideoView video = (VideoView)rootView.findViewById(R.id.videoView);

        video.requestFocus();

        String videopath = "android.resource://com.r.teamkape.kiddiecodiel/" + R.raw.helloworldvid;

        video.setVideoURI(Uri.parse(videopath));

        video.setMediaController(new MediaController(this)); //error in (this)[enter image description here][1]

        video.requestFocus();
        video.start();
    }
}

3 个答案:

答案 0 :(得分:3)

public class Tab1Helloworld extends Fragment 
{ 
  @Override 
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { View rootView = inflater.inflate(R.layout.tab1helloworld,container, false); 

     VideoView video = (VideoView)rootView.findViewById(R.id.videoView);

       video.requestFocus();

       String videopath = "android.resource://com.r.teamkape.kiddiecodiel/" + R.raw.helloworldvid;

       video.setVideoURI(Uri.parse(videopath));

       video.setMediaController(new MediaController(getActivity())); //error in (this)[enter image description here][1]

       video.requestFocus();
       video.start();
       return rootView;
          }
   }

答案 1 :(得分:0)

您添加的错误的问题

flag    Error:(33, 54) error: incompatible types: Tab1Helloworld cannot be converted to Context

就在这一行

替换

video.setMediaController(new MediaController(this)); 

 video.setMediaController(new MediaController(getActivity())); 

也移动

return rootView; 

在启动视频后的方法结束

答案 2 :(得分:0)

@xhen,使用以下代码,这非常有效,

xml布局中的

添加此

<sg.xyz.test.util.CustomVideoView
    android:id="@+id/videoview"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentTop="true"
     />
Fragment类中的

会调用这些方法

 private MediaController mediaController;
 private Uri uri;

 public void setupVideo(){
 if (mediaController == null) {
                mediaController = new
                        MediaController(mContext);

                mediaController.setAnchorView(mBinding.videoview);
                mBinding.videoview.setMediaController(mediaController);
            }
            try {
                uri = Util.buildURiPath(resourceID);
                mBinding.videoview.setVideoURI(uri);

            } catch (Exception e) {
                Logger.debug("Error: " + e.getMessage());
                e.printStackTrace();
            }
            mBinding.videoview.requestFocus();
            mBinding.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    mBinding.videoview.start();

                    mBinding.imageView.setVisibility(View.INVISIBLE);

                }
            });
            mBinding.videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {

                    mp.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
                        @Override
                        public void onVideoSizeChanged(MediaPlayer mediaPlayer, int width, int height) {
                            mediaController.setAnchorView(mBinding.videoview);
                        }
                    });
                    Logger.debug("Duration = " +
                            mBinding.videoview.getDuration());

                }
            });
            mBinding.videoview.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    AlertDialogFactory.buildAlertDialog(mContext, 0, R.string.video_playing_error).show();
                    return false;
                }
            });
 }


public static Uri buildURiPath(int resourceID)
{
    String uriPath = String.valueOf(Uri.parse("android.resource://" + LoginActivity.PACKAGE_NAME + "/"
            +resourceID));
    Uri uri = Uri.parse(uriPath);
    return uri;
}

将此mBinding.videoview替换为您的video对象。 现在,创建CustomVideoView

public class CustomVideoView extends VideoView {

private int width;
private int height;
private Context context;
private VideoSizeChangeListener listener;
private boolean isFullscreen;

public CustomVideoView(Context context) {
    super(context);
    init(context);
}

public CustomVideoView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

/**
 * get video screen width and height for calculate size
 *
 * @param context Context
 */
private void init(Context context) {
    this.context = context;
    setScreenSize();
}

/**
 * calculate real screen size
 */
private void setScreenSize() {
    Display display = ((Activity) context).getWindowManager().getDefaultDisplay();

    if (Build.VERSION.SDK_INT >= 17) {
        //new pleasant way to get real metrics
        DisplayMetrics realMetrics = new DisplayMetrics();
        display.getRealMetrics(realMetrics);
        width = realMetrics.widthPixels;
        height = realMetrics.heightPixels;

    } else if (Build.VERSION.SDK_INT >= 14) {
        //reflection for this weird in-between time
        try {
            Method mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            width = (Integer) mGetRawW.invoke(display);
            height = (Integer) mGetRawH.invoke(display);
        } catch (Exception e) {
            //this may not be 100% accurate, but it's all we've got
            width = display.getWidth();
            height = display.getHeight();
        }

    } else {
        //This should be close, as lower API devices should not have window navigation bars
        width = display.getWidth();
        height = display.getHeight();
    }

    // when landscape w > h, swap it
    if (width > height) {
        int temp = width;
        width = height;
        height = temp;
    }
}

/**
 * set video size change listener
 *
 */
public void setVideoSizeChangeListener(VideoSizeChangeListener listener) {
    this.listener = listener;
}

public interface VideoSizeChangeListener {
    /**
     * when landscape
     */
    void onFullScreen();

    /**
     * when portrait
     */
    void onNormalSize();
}

@Override
public void setVideoURI(Uri uri) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(this.getContext(), uri);
    width = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
    height = Integer.parseInt(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
    super.setVideoURI(uri);
    super.setVideoURI(uri);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // full screen when landscape
        setSize(height, width);
        if (listener != null) listener.onFullScreen();
        isFullscreen = true;
    } else {
        // height = width * 9/16
        setSize(width, width * 9 / 16);
        if (listener != null) listener.onNormalSize();
        isFullscreen = false;
    }
}

/**
 * @return true: fullscreen
 */
public boolean isFullscreen() {
    return isFullscreen;
}

/**
 * set video sie
 *
 * @param w Width
 * @param h Height
 */
private void setSize(int w, int h) {
    setMeasuredDimension(w, h);
    getHolder().setFixedSize(w, h);
}
}