How to get HTML5 video URI in HTML5VFullScreen$SurfaceVideoView in Android 4.0?

android, html, surfaceview, uri, video

Solution

Easy, using reflection. Put this inside of the `onShowCustomView()` method:

android.net.Uri mUri = null;

try
{
    @SuppressWarnings("rawtypes")
    Class _VideoSurfaceView_Class_ = Class.forName("android.webkit.HTML5VideoFullScreen$VideoSurfaceView");

    java.lang.reflect.Field _HTML5VideoFullScreen_Field_ = _VideoSurfaceView_Class_.getDeclaredField("this$0");

    _HTML5VideoFullScreen_Field_.setAccessible(true);

    Object _HTML5VideoFullScreen_Instance_ = _HTML5VideoFullScreen_Field_.get(((FrameLayout) view).getFocusedChild());

    @SuppressWarnings("rawtypes")
    Class _HTML5VideoView_Class_ = _HTML5VideoFullScreen_Field_.getType().getSuperclass();

    java.lang.reflect.Field _mUri_Field_ = _HTML5VideoView_Class_.getDeclaredField("mUri");

    _mUri_Field_.setAccessible(true);

    mUri =  (Uri) _mUri_Field_.get(_HTML5VideoFullScreen_Instance_);
}
catch (Exception ex)
{   
}

if (mUri != null)
{
    // There you have, mUri is the URI of the video
}

Problem

I am trying to get a HTML5 video URI when the user clicks the fullscreen button in the video control bar. According to this, the HTML5 video view in Android 4.0 is a SurfaceView, not a VideoView. Could someone tell me how to get the URI in SurfaceVideoView? This is my code. Thanks a lot. ``` webView.setWebChromeClient(new WebChromeClient(){ @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); if (view instanceof FrameLayout){ final FrameLayout frame = (FrameLayout) view; if (frame.getFocusedChild() instanceof SurfaceView){ SurfaceView video= (SurfaceView) frame.getFocusedChild(); } } }); ```

Original source