WebView+H 5ハイブリッド開発まとめ

3432 ワード

現在、androidが独自のWebViewコントロールを採用し、Html 5をロードしてハイブリッド開発を実現するAppアプリケーションがあります.みんなは開発の中できっと多くの穴に出会ったことがあって、いくつかの問題を総括するつもりで、以下の通りです:
  • java呼び出しjsはどのように実現しますか?
  • Android4.2 WebViewのaddJavascriptInterface脆弱性ソリューションをダウンロードしますか?
  • Android4.4ファイルのアップロードをサポートしますか?
  • WebViewはどのようにしてドロップダウンのリバウンド効果を実現しますか?
  • WebViewはどのようにクッキー管理を実現しますか?

  • すべての解決方法のソースコードWebViewH 5 Mutual
    最初の質問
    AndroidでJSコードを呼び出す方法は2つあります.  (1)WebViewのloadUrl()   (2)WebViewのevaluateJavascript()
      evaluateJavascriptメソッドはandroid 4.4以降に提供されるメソッドで、より効率的です.実行プロセスではページはリフレッシュされず、loadUrlではインタフェースがリフレッシュされます.
    解決策    2つの方法を混合して使用します.すなわち、Android 4.4以下はloadUrl方法、Android 4.4以上はevaluateJavascript方法を使用します.
        public void callJs(String js, final ValueCallback callback) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                mWebView.evaluateJavascript(js, new ValueCallback() {
                    @Override
                    public void onReceiveValue(String value) {
                        if (callback != null)
                            callback.onReceiveValue(value);
                    }
                });
            } else {
                mWebView.loadUrl(js);
            }
        }
    

    2番目の質問
    3番目の質問
    WebChromeClientのopenFileChooser()メソッドを書き換える.
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
            LogUtils.i(TAG, "openFileChooser>=5.0");
            if (AgentWebUtils.isOverriedMethod(mWebChromeClient, "onShowFileChooser", ChromePath + ".onShowFileChooser", WebView.class, ValueCallback.class, FileChooserParams.class)) {
    
                return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
            }
        webview.setWebChromeClient(new WebChromeClient() {
    
            // For Android < 3.0
            public void openFileChooser(ValueCallback valueCallback) {
                ***
            }
    
            // For Android  >= 3.0
            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
                ***
            }
    
            //For Android  >= 4.1
            public void openFileChooser(ValueCallback valueCallback, 
                    String acceptType, String capture) {
                ***
            }
    
            // For Android >= 5.0
            @Override
            public boolean onShowFileChooser(WebView webView, 
                    ValueCallback filePathCallback, 
                    WebChromeClient.FileChooserParams fileChooserParams) {
                ***
                return true;
            }
    
        });
    

    4番目の質問
    5番目の質問
    CookieManagerを使用して、CookieをWebViewに同期します.APIが21以下の場合、CookieManagerの前にCookieSyncManagerを呼び出す必要がある.createInstance(context)メソッド.
       public static boolean syncCookie(Context context, String url, String cookie) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                CookieSyncManager.createInstance(context);
            }
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setCookie(url, cookie);//        ,      session id "key=value"    cookie  
            String newCookie = cookieManager.getCookie(url);
            return TextUtils.isEmpty(newCookie)?false:true;
        }