Android H5交互Webview實現localStorage數據存儲


先看看效果圖吧

 

實現比較簡單,但是第一次用可能會遇到一些坑

首先得有Webview控件:

有人問我是不是需要寫布局文件,不寫行不行,現在我就告訴你們,不寫沒問題,需要寫就寫不寫直接創建New一個也行。 下面我就介紹一個,我new一個Webview實現localStorage。

 WebView mywebView = new WebView(this);
 mywebView.getSettings().setJavaScriptEnabled(true);
 mywebView.getSettings().setDomStorageEnabled(true);// 打開本地緩存提供JS調用,至關重要
 mywebView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);// 實現8倍緩存
 mywebView.getSettings().setAllowFileAccess(true);
 mywebView.getSettings().setAppCacheEnabled(true);
 String appCachePath = getApplication().getCacheDir().getAbsolutePath();
 mywebView.getSettings().setAppCachePath(appCachePath);
 mywebView.getSettings().setDatabaseEnabled(true);

上面這些settings是實現localStorage需要的存儲條件。

其次就是如何實現localStorage本地存儲了:

其實我在網上搜索了很多比如這樣:

 String userAgent = "shixinzhang";
 String js = "window.localStorage.setItem('userAgent','" + userAgent + "');";
 String jsUrl = "javascript:(function({
    var localStorage = window.localStorage;
    localStorage.setItem('userAgent','" + userAgent + "')
 })()";
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    mWebView.evaluateJavascript(js, null);
 } else {
    mWebView.loadUrl(jsUrl);
    mWebView.reload();
 }

這里就會出現很多坑了,當然我也踩過比如你直接將該代碼復制到settings下面,直接運行你會發現你存不進去反而出現報錯, 你會發現提示Window找不到localStorage屬性,怎么都存不進去。不是說上面代碼寫的是錯誤的,而是這樣寫的確有問題, 因為Webview瀏覽器並未打開找不到localStorage,所以要想解決這個問題就得先打開Android的Webview瀏覽器才能找到localStorage。 關於上面代碼如果想用可以提供一種解決方案,那就是將上面代碼寫在onPageFinished里:

 mywebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                String userAgent = "shixinzhang";
                String js = "window.localStorage.setItem('userAgent','" + userAgent + "');";
                String jsUrl = "javascript:(function({
                    var localStorage = window.localStorage;
                    localStorage.setItem('userAgent','" + userAgent + "')
                })()";
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    view.evaluateJavascript(js, null);
                } else {
                    view.loadUrl(jsUrl);
                    view.reload();
                }
            }
        });

當然這種寫法前提是最外層你得有:mywebView.loadUrl("地址"); 我覺得這樣寫除非在你已經有路徑可寫的情況下這樣可以,但是沒有的話就乖乖的寫一個吧,localStorage也寫在Html里面。

在javaScript.html文件實現localStorage數據存儲:

 <!DOCTYPE html>
 <html>
 <head>
    <meta charset="utf-8">
    <script>
       function saveData(param){
          <!--console.log("android調用此方法=====>saveData");-->
          localStorage.setItem("userAgent",param,true);
          console.log("android調用此方法=====>getData==="+localStorage.getItem("userAgent"));
          window.android.getUserKey(localStorage.getItem("userAgent"));
       }
    </script>
 </head>

 </html>

當然我在這里也寫了Js回調,不熟悉的可以參考一下:window.android.getUserKey(localStorage.getItem("userAgent"));

剩下就是如何調用該Html了:

 mywebView.loadUrl("file:///android_asset/javascript.html");
 mywebView.setWebViewClient(new WebViewClient() {
         @Override
         public void onPageFinished(WebView view, String url) {
             super.onPageFinished(view, url);
             view.loadUrl("javascript:saveData('123')");
         }
   });

注意:view.loadUrl("javascript:saveData('123')");一定要在onPageFinished之后執行,因為瀏覽器加載完成這之后才能找到localStorage屬性,因為這個是瀏覽器攜帶的屬性。

當然JS回調我也給你們寫出來:

 mywebView.addJavascriptInterface(new AppClass(getBaseContext()), "android");
 private class AppClass {
        private Context c;

        public AppClass(Context baseContext) {
            this.c = baseContext;
        }

        @JavascriptInterface
        public void getUserKey(String userKey) {
            Toast.makeText(c, userKey + "", Toast.LENGTH_SHORT).show();
            Log.e("Tag", "讀取到userKey : " + userKey);
        }
    }


源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM