Доступ запрещен с помощью локального хранилища в 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);

3 ответов


доступ к localStorage разрешено только на страницах из определенных" веб-безопасных " схем, таких как http:, https: и file:. Это не работает для about: и data: схемы, например, или для любой пользовательской схемы, которую вы можете использовать. Chrome ведет себя так же, вы можете проверить на рабочем столе.


чтобы манипулировать глобальным объектом в JS, нам нужен трюк. Как сказал @ Михаил Наганов, хром жалуется на безопасность Доступ запрещен с помощью локального хранилища в Android WebView

я загружаю js в качестве базового url и в js также перенаправляю на реальный url. Ниже код работал для меня в 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);

вы просили разрешения на доступ к хранилищу и сети в манифесте.в 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" />