Android webview & localStorage
у меня проблема с webview, который может получить доступ к localStorage с помощью HTML5
приложение. Испытание.HTML-файл сообщает мне, что местные
хранение не поддерживается моим браузером(т. е. элемент webview
). Если у вас есть какие-либо предложения..
package com.test.HelloWebView;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class HelloWebView extends Activity {
WebView webview;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new HelloWebViewClient());
webview.loadUrl("file:///android_asset/test.html");
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDatabaseEnabled(true);
String databasePath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
settings.setDatabasePath(databasePath);
webview.setWebChromeClient(new WebChromeClient() {
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
quotaUpdater.updateQuota(5 * 1024 * 1024);
}
});
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
private class HelloWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
6 ответов:
setDatabasePath() метод был устаревшим на уровне API 19. Я советую вам использовать локаль хранения следующим образом:
webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setDatabaseEnabled(true); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/"); }
У меня также была проблема с потерей данных после перезапуска приложения. Добавление этого помогло:
webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
решение, которое работает на моем Android 4.2.2, скомпилированное с помощью build target Android 4.4 W:
WebSettings settings = webView.getSettings(); settings.setDomStorageEnabled(true); settings.setDatabaseEnabled(true); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { File databasePath = getDatabasePath("yourDbName"); settings.setDatabasePath(databasePath.getPath()); }
Если ваше приложение использует несколько webview, у вас все равно будут проблемы : localStorage неправильно используется для всех веб-просмотров.
Если вы хотите совместно использовать одни и те же данные в нескольких веб-просмотров единственный способ, чтобы восстановить его с базой данных java и JavaScript интерфейс.
на этой странице на github показано, как это сделать.
надеюсь, что это поможет!
Если у вас есть несколько webview, localstorage не работает правильно.
два предложения:
- использование базы данных java вместо WebView localstorage, что "@Guillaume Gendre " объяснил.(конечно, это не работает для меня)
- локальное хранилище работает как json, поэтому значения хранятся как "ключ:значение" .вы можете добавить свой уникальный идентификатор браузера к его ключу и использовать обычный Android localstorage