WebView and HTML5 <video>

后端 未结 13 1832
面向向阳花
面向向阳花 2020-11-22 05:59

I\'m piecing together a cheapo app that amongst other things \"frames\" some of our websites... Pretty simple with the WebViewClient. until I hit the video.

13条回答
  •  春和景丽
    2020-11-22 06:25

    After long research, I got this thing working. See the following code:

    Test.java

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    
    public class Test extends Activity {
    
        HTML5WebView mWebView;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mWebView = new HTML5WebView(this);
    
            if (savedInstanceState != null) {
                mWebView.restoreState(savedInstanceState);
            } else {    
                mWebView.loadUrl("http://192.168.1.18/xxxxxxxxxxxxxxxx/");
            }
    
            setContentView(mWebView.getLayout());
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            mWebView.saveState(outState);
        }
    
        @Override
        public void onStop() {
            super.onStop();
            mWebView.stopLoading();
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (mWebView.inCustomView()) {
                    mWebView.hideCustomView();
                //  mWebView.goBack();
                    //mWebView.goBack();
                    return true;
                }
    
            }
            return super.onKeyDown(keyCode, event);
        }
    }
    

    HTML%VIDEO.java

    package com.ivz.idemandtest;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.Window;
    import android.webkit.GeolocationPermissions;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.FrameLayout;
    
    public class HTML5WebView extends WebView {
    
        private Context                             mContext;
        private MyWebChromeClient                   mWebChromeClient;
        private View                                mCustomView;
        private FrameLayout                         mCustomViewContainer;
        private WebChromeClient.CustomViewCallback  mCustomViewCallback;
    
        private FrameLayout                         mContentView;
        private FrameLayout                         mBrowserFrameLayout;
        private FrameLayout                         mLayout;
    
        static final String LOGTAG = "HTML5WebView";
    
        private void init(Context context) {
            mContext = context;     
            Activity a = (Activity) mContext;
    
            mLayout = new FrameLayout(context);
    
            mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.custom_screen, null);
            mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content);
            mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content);
    
            mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
    
            // Configure the webview
            WebSettings s = getSettings();
            s.setBuiltInZoomControls(true);
            s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
            s.setUseWideViewPort(true);
            s.setLoadWithOverviewMode(true);
          //  s.setSavePassword(true);
            s.setSaveFormData(true);
            s.setJavaScriptEnabled(true);
            mWebChromeClient = new MyWebChromeClient();
            setWebChromeClient(mWebChromeClient);
    
            setWebViewClient(new WebViewClient());
    
    setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    
            // enable navigator.geolocation 
           // s.setGeolocationEnabled(true);
           // s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");
    
            // enable Web Storage: localStorage, sessionStorage
            s.setDomStorageEnabled(true);
    
            mContentView.addView(this);
        }
    
        public HTML5WebView(Context context) {
            super(context);
            init(context);
        }
    
        public HTML5WebView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public HTML5WebView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(context);
        }
    
        public FrameLayout getLayout() {
            return mLayout;
        }
    
        public boolean inCustomView() {
            return (mCustomView != null);
        }
    
        public void hideCustomView() {
            mWebChromeClient.onHideCustomView();
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if ((mCustomView == null) && canGoBack()){
                    goBack();
                    return true;
                }
            }
            return super.onKeyDown(keyCode, event);
        }
    
        private class MyWebChromeClient extends WebChromeClient {
            private Bitmap      mDefaultVideoPoster;
            private View        mVideoProgressView;
    
            @Override
            public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
            {
                //Log.i(LOGTAG, "here in on ShowCustomView");
                HTML5WebView.this.setVisibility(View.GONE);
    
                // if a view already exists then immediately terminate the new one
                if (mCustomView != null) {
                    callback.onCustomViewHidden();
                    return;
                }
    
                mCustomViewContainer.addView(view);
                mCustomView = view;
                mCustomViewCallback = callback;
                mCustomViewContainer.setVisibility(View.VISIBLE);
            }
    
            @Override
            public void onHideCustomView() {
                System.out.println("customview hideeeeeeeeeeeeeeeeeeeeeeeeeee");
                if (mCustomView == null)
                    return;        
    
                // 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();
    
                HTML5WebView.this.setVisibility(View.VISIBLE);
                HTML5WebView.this.goBack();
                //Log.i(LOGTAG, "set it to webVew");
            }
    
    
            @Override
            public View getVideoLoadingProgressView() {
                //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");
    
                if (mVideoProgressView == null) {
                    LayoutInflater inflater = LayoutInflater.from(mContext);
                    mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
                }
                return mVideoProgressView; 
            }
    
             @Override
             public void onReceivedTitle(WebView view, String title) {
                ((Activity) mContext).setTitle(title);
             }
    
             @Override
             public void onProgressChanged(WebView view, int newProgress) {
                 ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
             }
    
             @Override
             public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                 callback.invoke(origin, true, false);
             }
        }
    
    
        static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
            new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
    

    custom_screen.xml

    
    
    
    
        
        
    
            
    
            
        
    
    

    video_loading_progress.xml

    
    
    
    
    
           
    
           
     
    

    colors.xml

    
    
    
    
        #ffffffff
        #ff000000
    
        #ffffffff
        #ff000000
    
        #ffffffff
        #ffffffff
    
        #ffffffff
        #ff000000
    
    
    
        #ffffffdffffd
    
    

    Manifest.xml

    
    
        
    
        
            
                
                    
                    
                
            
    
          
    
    
    
    
    
    
    
    
    

    Expecting rest of things you can understand.

提交回复
热议问题