Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not able to play video in Web View

i am not able to play video on Android web view.

I have kept the html and video file in my assets folder.

Whenever i load the html file , it gives me the error

05-01 12:31:16.092: E/MediaResourceGetter(17241): Unable to read file: file:///android_asset/MediaBook2%20(2)/2B952499A0E681.mp4

And whenever i press on the play button i get the following error

05-01 12:31:23.680: E/chromium(17241): [ERROR:webmediaplayer_android.cc(328)] Not implemented reached in virtual void content::WebMediaPlayerAndroid::setRate(double)
05-01 12:31:23.710: E/MediaPlayer(17241): error (1, -2147483648)
05-01 12:31:23.710: E/MediaPlayer(17241): Error (1,-2147483648)

Am able to load any remote video and run,But problem is when i load the local video from the assets folder Code to load the files and setup the web view

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // Remove title bar
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_webview);
    mContentView = (LinearLayout) findViewById(R.id.linearlayout);
    // Keep the webview setup ready
    setupWebView();


}

public void setupWebView()
{
    webView = (WebView) findViewById(R.id.webView);
    // progressBar = (ProgressBar) findViewById(R.id.progressBarForWebView);

    WebSettings webViewSettings = webView.getSettings();
    webViewSettings.setJavaScriptEnabled(true);
    webViewSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    webViewSettings.setPluginState(PluginState.ON);
    webView.getSettings().setAllowFileAccess(true);
    webView.setSoundEffectsEnabled(true);
    webView.setWebViewClient(new SLCWebViewClient());
    webView.setWebChromeClient(new WebChromeClient());
    loadContentsInWebView();

}
public void loadContentsInWebView()
    {

        String localURL = "file:///android_asset/MediaBook2 (2)/SampleForVideo.html";
        logger.debug("WebView URL: {}", localURL);
        try {
            webView.loadUrl(localURL);
        }
        catch (Exception e) {
            e.printStackTrace();
            logger.error("Error while loading url", e);
        }
    }
    private class SLCWebViewClient extends WebViewClient
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url)
    {
        view.setWebChromeClient(new WebChromeClient()
        {

            private View mCustomView;

            @Override
            public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
            {
                // if a view already exists then immediately terminate the new one
                if (mCustomView != null) {
                    callback.onCustomViewHidden();
                    return;
                }

                // Add the custom view to its container.
                mCustomViewContainer.addView(view, COVER_SCREEN_GRAVITY_CENTER);
                mCustomView = view;
                mCustomViewCallback = callback;

                // hide main browser view
                mContentView.setVisibility(View.GONE);

                // Finally show the custom view container.
                mCustomViewContainer.setVisibility(View.VISIBLE);
                mCustomViewContainer.bringToFront();
            }

        });

        webView.loadUrl(url);

        return true;
    }

The Sample For Video.html code

    <!DOCTYPE html>
<html>
<title>Testing for Video</title>
<body>

<video width="320" height="240" controls>
  <source src="2B952499A0E681.mp4">
</video>

</body>
</html>

Code for the layout file

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
      android:id="@+id/fullscreen_custom_content"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="#FF000000"/>

<LinearLayout 
      android:id="@+id/linearlayout"
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

 <WebView
       android:id="@+id/webView"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" />

cheers, Saurav

like image 905
saurav Avatar asked May 01 '14 06:05

saurav


2 Answers

Thanks to Marcin for his answer.

I could run the the html files by loading the video. My problem was i was using /MediaBook2 (2)/SampleForVideo.html. But the '/' should be removed when loading from assets. I splitted the string by trimming off the '/' and it worked.

But that was just a sample scenario i was working on to clear my understanding.

I have a much bigger folder structure and now when the .mp4 file is eventually loaded.

The media player is shown but the player is not playing any file.

like image 101
saurav Avatar answered Oct 08 '22 18:10

saurav


The file:///android_asset protocol is a WebView-specific thing. That is: other system components can't read those URLs.

The MediaResourceGetter doesn't use the WebView's network stack and therefore doesn't "understand" the file:///android_asset protocol.

In your other question you mentioned you use a local http server - try serving the .mp4 from that.

like image 27
marcin.kosiba Avatar answered Oct 08 '22 20:10

marcin.kosiba