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 197

6 ответов:

следующее отсутствовало:

settings.setDomStorageEnabled(true);

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 не работает правильно.
два предложения:

  1. использование базы данных java вместо WebView localstorage, что "@Guillaume Gendre " объяснил.(конечно, это не работает для меня)
  2. локальное хранилище работает как json, поэтому значения хранятся как "ключ:значение" .вы можете добавить свой уникальный идентификатор браузера к его ключу и использовать обычный Android localstorage