【问题标题】:Why can't I access localStorage in a string variable on android studio?为什么我不能在 android studio 的字符串变量中访问 localStorage?
【发布时间】:2017-08-09 05:23:15
【问题描述】:

我有一个非常基本的 webview 应用程序代码:

package com.budget.noname.budget;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String data = "<p id='v'></p><script>x=3; y=5; m=0; document.getElementById('v').innerHTML = m;</script>";
        WebView simpleWebView=(WebView) findViewById(R.id.simpleWebView);
        WebSettings webSettings = simpleWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setDomStorageEnabled(true);
        //simpleWebView.loadUrl("file:///android_asset/index.htm");
        simpleWebView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", "");

    }
}

如果我将我的 webapp (index.htm) 放在 assets 文件夹中并加载它,它可以完美运行,但我的代码可供任何关心提取 .apk 的人使用。

我试图将代码粘贴到字符串上并使用 loadDataWithBaseURL 加载它。它几乎同样有效。问题是:如果我尝试访问 localStorage,代码就会中断。这是为什么呢?

例子:

String data = "<script>x=localStorage.getItem('name');</script>";

没有用!!!虽然,正如我所说,如果我从资产文件夹中加载相同的代码,它就可以工作。

【问题讨论】:

  • 您遇到了哪个错误。您是否具有清单中声明的​​内部存储的读/写权限?
  • 我没有得到任何错误,因为我不知道如何调试 webapp。就是这么简单:我编写的任何 html/javascript 代码都可以工作,除了 localStorage 标签。
  • @Baruch,标签是自动建议的
  • @Baruch,我不确定你为什么认为这个问题与 JavaScript 无关。如果我正确理解问题,则错误发生在 Android 应用程序内 WebView 内的 JavaScript 执行期间。

标签: javascript java android android-webview local-storage


【解决方案1】:

就像已经stated here before:

访问localStorage 只允许在某些页面上 "Web-safe" 方案,例如 http:https:file:。它不适用于 例如about:data: 方案,或者对于您的任何自定义方案 可能正在使用。

如果你看一下the loadDataWithBaseURL()'s docs,我们可以看到baseUrl参数的以下语句:

String: 用作页面基本 URL 的 URL。如果null 默认为 'about:blank'。

这解释了为什么只有您的 file:/// 示例有效,也意味着您必须将有效的东西传递给此参数。你可以加载任何你想要的 URL,比如:

webView.loadDataWithBaseURL("http://google.com", data, "text/html", "UTF-8", "");

甚至http://localhost:80 也会让它工作。


但是,这不会使您的 localStorage 值可用于 WebView 的其他实例(默认情况下,它们不会在 Android 上进行对话)。一个常见的选择是使用另一个为您抽象它的库,例如AndroidLocalStorage,例如

【讨论】:

  • 非常感谢。您是否知道使访问资产文件夹比仅“提取” apk 更难的任何实用方法?
  • 基本不可能。看一看:stackoverflow.com/questions/18151308/… 实际上,我不知道您必须添加多少复杂性才能将文件加密到 Android 应用程序本身。我建议远程请求这些资源(例如,从休息中),这是一种选择......
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多