在Android WebView中使用本地存储拒绝访问

时间:2015-05-05 19:13:09

标签: javascript android webview

我有一个Android webview,我相信它拥有访问和使用localStorage所需的一切,但是,当我尝试使用本地存储时,我在控制台中看到“拒绝访问”错误。 Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.

有人能发现问题吗?

JavaScript代码:

function localStorageTest() {
  // Check browser support
  if (typeof(Storage) != "undefined") {
    // Store
    localStorage.setItem("lastname", "Smith");
    // Retrieve
    document.getElementById("console").innerHTML = localStorage.getItem("lastname");
  } else {
    document.getElementById("console").innerHTML = "Sorry, your browser does not support Web Storage...";
  }
}

以下是Android代码:

    // Enable javascript
    WebSettings settings = getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);
    settings.setDatabaseEnabled(true);

    // Create database folder
    String databasePath = getContext().getDir("databases", Context.MODE_PRIVATE).getPath();
    getSettings().setDatabasePath(databasePath);

    getContext().getPackageName() + "/databases/");

    settings.setAppCacheEnabled(true);
    settings.setSaveFormData(true);;
    settings.setLoadWithOverviewMode(true);
    settings.setSaveFormData(true);

5 个答案:

答案 0 :(得分:8)

仅允许访问localStorage来自某些网页安全"方案,例如http:https:file:。例如,它不适用于about:data:方案,也不适用于您可能使用的任何自定义方案。 Chrome的行为方式相同,您可以在桌面上查看。

答案 1 :(得分:5)

要在JS中操作全局对象,我们需要一个技巧。正如@Mikhail Naganov所说,铬抱怨安全问题Access denied using local storage in Android WebView

我将js作为基本网址加载,并且在js中也会重定向到真正的网址。下面的代码在android 7中为我工作

    String mimeType = "text/html";
    String encoding = "utf-8";
    String injection = "<script type='text/javascript'>localStorage.setItem('key', 'val');window.location.replace('REAL_URL_HERE');</script>";
    webview.loadDataWithBaseURL("REAL_URL_HERE", injection, mimeType, encoding, null);

答案 2 :(得分:3)

这对我有用

webview.getSettings().setAllowFileAccess(true);

答案 3 :(得分:1)

您是否要求在manifest.xml中访问存储和网络的权限?

这样的事情:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 4 :(得分:0)

我遇到了相关错误。除了最后一部分Access is denied for data:

,一切都一样

就我而言,我正在加载一个 html 内容,该内容与具有指定 src 的脚本交互。为了让 webView 呈现这个 src,我必须从 <script> 部分提取 url 并在方法 loadDataWithBaseURL 上调用它作为 baseUrl 并将 html 作为数据。

web.loadDataWithBaseURL(urlSrc, data, "text/html", "utf-8")