如何在Android中将值写入HTML5本地存储?

14

我有一个使用webview的安卓应用程序,它打开了一个包含HTML5/ JavaScript代码的网页。我想要从安卓应用程序的一侧向浏览器侧传递一些值。所以我想在安卓端写入HTML5本地存储,然后网页的Javascript部分从本地存储中读取该值。

安卓webview如何写入HTML5本地存储?

或者,安卓是否有一种方法可以将一些值传递给它加载的页面的javascript?(而无需重新加载整个页面)例如,将某些东西写入HTML5本地存储,然后javascript代码从HTML5本地存储中读取该内容。

这与如何将JSON格式数据从Webview传递到HTML页面不同。我需要一种通过安卓写入HTML5本地存储的方法。


你为什么需要向webview传递数据? - user3451822
你尝试过使用 setDomStorageEnabled 吗? - Pedro Oliveira
3个回答

22

像字符串一样传递变量 stackoverflow post

   webView.getSettings().setJavaScriptEnabled(true);
   webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
               String key = "hello";
               String val = "world";
               if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                   webView.evaluateJavascript("localStorage.setItem('"+ key +"','"+ val +"');", null);
               } else {
                   webView.loadUrl("javascript:localStorage.setItem('"+ key +"','"+ val +"');");
               }
            }
   });

第二种方法是使用JavaScriptInterface。
初始化部分。
 JavaScriptInterface jsInterface = new JavaScriptInterface(this);
 webView.getSettings().setJavaScriptEnabled(true);
 webView.addJavascriptInterface(jsInterface, "JSInterface");

JavaScriptInterface

  public class JavaScriptInterface {
        private Activity activity;
    
        public JavaScriptInterface(Activity activiy) {
            this.activity = activiy;
        }
    
        public string getData(String someParameter){
           //also you can return json data as string  and at client side do JSON.parse
           if (someParameter == "give me data" && this.activity.data != null) {
                return this.activity.data;
           }else{
                return null;
           }
        }
    }

Js部分

<script>
  function ready() {
        var data = window.JSInterface.getData("give me data");
        localStorage.put("give me data", data)
  };

  document.addEventListener("DOMContentLoaded", ready);
</script>

谢谢你的回答。帮了我很多。 - André Luiz Reis
如果网站使用Angular(TypeScript),如何获取JSInterface - KSK
我遇到了以下异常 java.lang.RuntimeException: Stub! 在 android.content.Context.<init>(Context.java:4) 在 android.content.ContextWrapper.<init>(ContextWrapper.java:5) 在 android.view.ContextThemeWrapper.<init>(ContextThemeWrapper.java:5) 在 android.app.Activity.<init>(Activity.java:6) 在 main.java.tools.MyWebView.<init>(MyWebView.java:8) - Baala
@AndréLuizReis - 你能分享一下代码片段吗?我现在正在寻找如何将本地存储的值传递给Appium测试。 - Baala
@Alex Nikulin 你好,能否帮我看一下这个问题:https://stackoverflow.com/questions/63498385/how-to-pass-parameters-in-webview,类似的问题。谢谢! - pratik vekariya

2
Android webview如何写入HTML5 localstorage?
   localStorage.setItem("data", value);

注意:使用本地存储,Web应用程序可以在用户的浏览器中本地存储数据。HTML本地存储;比cookie更好。
尝试使用addJavaScriptInterface()将您的Android类和网页绑定。

-3
你可以通过 JavaScript 的 Location Hash 属性来实现它。
Android 代码可能如下所示。
WebView myWebView = (WebView) findViewById(R.id.myWebView);  
myWebView.loadUrl("http://www.example.com/#any_value");
myWebView.setWebViewClient(new MyWebViewClient());

而 JavaScript 代码看起来像这样

var x = location.hash; //this will access the hash value you pass in url
localStorage.setItem("save_my_value", x);

不好用!我想要在 Android 传输一些数据,比如一些字符串,在那个 HTML 页面中我写的 JS 代码,而不是反过来。 - Waterfr Villa
我不想每次传递一个新值时重新加载整个页面。 - Waterfr Villa
@WaterfrVilla,无论是带有哈希的loadUrl变量还是只有URL的javascript:,都不会重新加载您的页面。 - Alex Nikulin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接