Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
764 views
in Technique[技术] by (71.8m points)

android - Playing youtube videos smoothly in web view

I am building an app where a user can see a YouTube video and can see the images for which link is coming from the sever. To play YouTube video embed key's value is coming from server as

`<div id="_cvp_11204"><span> </span></div> <script type="text/javascript"> (function(){var a;a=new XMLHttpRequest;a.onreadystatechange=function(){rs=a.readyState;if(4==rs&&200==a.status){var c=JSON.parse(a.responseText),b;for(b in c.payload)if(c.payload.hasOwnProperty(b)){var d=c.payload[b];document.getElementById("cvp"+b).innerHTML=d.view}}};a.open("GET","http://dummyurl.com/media.ids=?11134 ));a.send()})(window);

&lt;/script&gt;`

and i am able to play the video also but i am facing few issue in terms of performance.

1) sometimes voices starts but video starts showing after some time.

2) Sometime controls doesn't show up.

3) How can i play the video directly in fullscreen mode?Currently to play the video in full screen mode i have to click on the max control to play it.

As is the activity class for webview

public class MainActivity extends Activity {

    protected FrameLayout webViewPlaceholder;
    protected WebView webView;
    private FrameLayout mContentView;
    private MyWebChromeClient mWebChromeClient = null;
    private View mCustomView;
    private FrameLayout mCustomViewContainer;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        System.out.println("Oncreate is getting called ---------------------------");
        // Initialize the UI
        if(savedInstanceState == null){
            initUI();   
        }

      }

      protected void initUI()
      {
        // Retrieve UI elements
        webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));
        mContentView = webViewPlaceholder;
        // Initialize the WebView if necessary
        if (webView == null)
        {
            System.out.println("webView == null -----------------------------------");
          // Create the webview
          webView = new WebView(this);
          webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
          WebSettings webSettings = webView.getSettings();
          webSettings.setJavaScriptEnabled(true);
            webSettings.setDomStorageEnabled(true);
            webSettings.setAllowContentAccess(true);
            webSettings.setDomStorageEnabled(true);
            webSettings.setRenderPriority(RenderPriority.HIGH);     
            webSettings.setUseWideViewPort(false);
            webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
            webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
            //--------------------------------------------------------
            if (Build.VERSION.SDK_INT < 8) {
                webSettings.setPluginsEnabled(true);
            } else {
                webSettings.setPluginState(PluginState.ON);
            }
          mWebChromeClient = new MyWebChromeClient();
          webView.setWebChromeClient(mWebChromeClient);
          // Load the URLs inside the WebView, not in the external web browser
          //webView.setWebViewClient(new WebViewClient());
          // Load a page
          loadWebView("asfas");
        }



        // Attach the WebView to its placeholder
        webViewPlaceholder.addView(webView);
      }

      private void loadWebView(final String url) {
            String s = ReadFromfile("link.txt", MainActivity.this);

            s = "<html><body>"+s+"</body></html>";
            webView.loadDataWithBaseURL("",Html.fromHtml(s).toString(),"text/html", "UTF-8",null);
        }

        public String ReadFromfile(String fileName, Context context) {
            StringBuilder ReturnString = new StringBuilder();
            InputStream fIn = null;
            InputStreamReader isr = null;
            BufferedReader input = null;
            try {
                fIn = context.getResources().getAssets()
                        .open(fileName, context.MODE_WORLD_READABLE);
                isr = new InputStreamReader(fIn);
                input = new BufferedReader(isr);
                String line = "";
                while ((line = input.readLine()) != null) {
                    ReturnString.append(line);
                }
            } catch (Exception e) {
                e.getMessage();
            } finally {
                try {
                    if (isr != null)
                        isr.close();
                    if (fIn != null)
                        fIn.close();
                    if (input != null)
                        input.close();
                } catch (Exception e2) {
                    e2.getMessage();
                }
            }
            return ReturnString.toString();
        }


      @Override
      public void onConfigurationChanged(Configuration newConfig)
      {
        if (webView != null)
        {
          // Remove the WebView from the old placeholder
        System.out.println("web view is removed from the holder -------------------------");    
          webViewPlaceholder.removeView(webView);
        }

        super.onConfigurationChanged(newConfig);

        // Load the layout resource for the new configuration
        setContentView(R.layout.activity_main);

        // Reinitialize the UI
        initUI();
      }

      @Override
      protected void onSaveInstanceState(Bundle outState)
      {
        super.onSaveInstanceState(outState);
        System.out.println("onSaveInstanceState -------------------------");    
        // Save the state of the WebView
        webView.saveState(outState);
      }

      @Override
      protected void onRestoreInstanceState(Bundle savedInstanceState)
      {
        super.onRestoreInstanceState(savedInstanceState);
        System.out.println("onRestoreInstanceState -------------------------"); 
        // Restore the state of the WebView
        webView.restoreState(savedInstanceState);
      }
      private class MyWebChromeClient extends WebChromeClient {
            FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.MATCH_PARENT);

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

                mContentView.setVisibility(View.GONE);
                mCustomViewContainer = new FrameLayout(MainActivity.this);
                mCustomViewContainer.setLayoutParams(LayoutParameters);
                mCustomViewContainer.setBackgroundResource(android.R.color.black);
                view.setLayoutParams(LayoutParameters);
                // Sometimes getting remove view first it parent excepetion on moto devices
                //webViewPlaceholder.removeView(webView);
                mCustomViewContainer.addView(view);
                mCustomView = view;
                mCustomViewCallback = callback;
                mCustomViewContainer.setVisibility(View.VISIBLE);
                setContentView(mCustomViewContainer);
            }

            @Override
            public void onHideCustomView() {
                if (mCustomView == null) {
                    return;
                } else {
                    // Hide the custom view.  
                    mCustomView.setVisibility(View.GONE);
                    // Remove the custom view from its container.  
                    mCustomViewContainer.removeView(mCustomView);
                    mCustomView = null;
                    mCustomViewContainer.setVisibility(View.GONE);
                    mCustomViewCallback.onCustomViewHidden();
                    // Show the content view.  
                    mContentView.setVisibility(View.VISIBLE);
                    setContentView(mContentView);
                }
            }

        }

}

And in Manifest also I have set the hardwareaccelarated = true. here is the video when it starts with controls

and here when i click on maximize button video gets full screen which i want without clicking on max button but video should directly play in fullscreen mode.

enter image description here

So mainly, how I can speed up and increase the performance of my WebView?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...