【问题标题】:Android - Reading HTML5 localStorage data direct from JavaAndroid - 直接从 Java 读取 HTML5 localStorage 数据
【发布时间】:2019-06-11 22:08:10
【问题描述】:

我有一个带有 WebView 的简单 Android 应用。 WebView 设置为浏览到使用 JavaScript 的 localStorage 功能的站点。

我已经将 WebSettings 设置为允许 DomStorage:

webSettings.setJavaScriptEnabled(true);
ebSettings.setDomStorageEnabled(true);

String dbPath = this.getApplicationContext().getDir("database", MODE_PRIVATE).getPath();        
webSettings.setDatabasePath(dbPath);

我需要的是一种方法,让我的 Java 代码可以读取使用 localStorage 机制存储的变量,即:

JavaScript 会这样做:

    var storage = window.localStorage;
    storage.setItem("name", "Hello World!");

如何从 Java 代码的 localStorage 中读取“name”的值?

【问题讨论】:

  • 这里没有一个解决方案适合我。你有运气吗?

标签: android local-storage


【解决方案1】:

可以在 java (Android) 中读取 localStorage 值。

使用这个插件https://www.npmjs.com/package/cordova-plugin-nativestorage 使用本机存储。

-为此我们必须在cordova中设置值

    NativeStorage.setItem("reference", obj, setSuccess, setError);
    function setSuccess(obj){
    }
    function setError(obj){
    }

并在 Anroid Java 文件中获取此值:

    SharedPreferences sharedPreferences = getSharedPreferences("MainActivity", MODE_PRIVATE);
    System.out.println("********---------    shared pref values...   " +  sharedPreferences.getString("myid", "no value"));

【讨论】:

    【解决方案2】:
    yourWebView.setWebChromeClient(new WebChromeClient(){
          public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d(tag, "That's my local storage value =" + message);
            return false;
          };
        });
    (...)
        yourWebView.loadURL("javascript:alert(localStorage.getItem(\"name\"))");
    

    【讨论】:

    • 这给了我:“Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document。”
    • @Onheiron 我也面临同样的问题。你解决了吗?
    【解决方案3】:

    在你的活动中

    webView.addJavascriptInterface(myInterface, "JSInterface");
    

    Javascript接口类

    class myInterface
    {
    
        @JavascriptInterface
        public void getVariable(string fromLocalStorage)
        {
        //your code
        }
    
    }
    

    在 JavaScript 中

    window.JSInterface.getVariable(localStorage.getItem("variableName"))
    

    【讨论】:

    • 这使用 JavaScript 来获取值。我需要我的 Android 应用程序从浏览器请求值,而不是由浏览器启动它。我不能使用这种方法调用webView.loadUrlwebView.evaluateJavaScript,因为它实际上从来没有这样做过。
    【解决方案4】:

    写入数据:

    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 +"');");
    }
    

    读取和提醒数据:

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
         webView.evaluateJavascript("window.alert(localStorage.getItem('"+ key +"'));", null);
    } else {
         webView.loadUrl("javascript:window.alert(localStorage.getItem('"+ key +"'));");
    }
    

    还有记得开启Android的JavaScriptWebvView

    webView.getSettings().setJavaScriptEnabled(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-04-29
      • 2013-08-15
      • 2013-09-06
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多