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