Веб-просмотр Android и localStorage

242

У меня проблема с веб-просмотром, который может получить доступ к localStorage HTML5приложением. Файл test.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; 
    } 
}
} 
Томас
источник

Ответы:

518

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

settings.setDomStorageEnabled(true);
Томас
источник
1
тоже самое :) спасибо большое. Я также должен был убедиться, что вы нацелены как минимум на Android 2.1 и более поздних версий: добавьте android: minSdkVersion = "7" в свой манифест и измените цель сборки проекта (в eclipse) как минимум на 2.1.
danmux
46

Метод 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/");
}
mr.boyfox
источник
1
@ Ram Swaroop Может быть, достаточно просто использовать setDomStorageEnabled (true), чтобы включить локальное хранилище для вас. Может быть, вы используете последнюю версию Android и устройства, и эта проблема не возникла у вас, не так ли? (Может быть, достаточно просто использовать setDomStorageEnabled (true), чтобы включить локальное хранилище для вас), но некоторые версии android (Exm: old) проблема с использованием локального хранилища после перезапуска приложения потеряла хранилище локали. У кого-то появилась эта проблема и они голосуют за мой ответ. Если у вас есть идеи, вы можете добавить еще один ответ.
mr.boyfox
Я пробовал использовать ваше решение, но по-прежнему localStorage не сохраняется после того, как приложение было убито / перезапущено, но иногда после многих перезапусков localStorage возобновляет работу и данные, которые там были сохранены, корректно извлекаются. Это необычно, но это происходит в моем случае. (Проверено на Sony Xperia SP)
Рам Патра
@Ramswaroop Я использую Nexus4, и у меня также нет проблем с локальным хранилищем. Но когда я тестировал на Samsung Galaxy SII, возникла эта проблема. Я не говорю, что все устройства работают так, просто некоторые устройства имеют его.
mr.boyfox
25

У меня также были проблемы с потерей данных после перезапуска приложения. Добавление этого помогло:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
я беру
источник
Это решило проблему потери данных, но что это? Разработать немного?
Сорин Команеску
из описания API: «Чтобы API хранилища базы данных функционировал правильно, этот метод должен вызываться с путем, по которому приложение может написать». developer.android.com/reference/android/webkit/…
iTake
15

Решение, которое работает на моем Android 4.2.2, скомпилировано с целевой сборкой Android 4.4W:

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());
}
AngryWolf
источник
4

Если ваше приложение использует несколько веб-просмотров, у вас по-прежнему будут проблемы: localStorage неправильно распределяется по всем веб-просмотрам.

Если вы хотите совместно использовать одни и те же данные в нескольких веб-обозрениях, единственный способ - восстановить их с помощью базы данных java и интерфейса javascript.

Эта страница на GitHub показывает, как это сделать.

надеюсь, это поможет!

Гийом Жандр
источник
Здравствуй! мы создали инструмент для этого исправления localStorage и некоторых других интересных вещей для гибридных приложений: cobalt, платформа с открытым исходным кодом для создания приложений с несколькими веб-представлениями. Мы усовершенствовали localStorage и добавили плагин pubsub для «общения» между веб-представлениями. взгляните на cobaltians.org
Гийом
СПАСИБО. Мой босс только что задал тот же вопрос. Это поможет.
hsu.tw
0

Если у вас есть несколько веб-просмотров, localstorage не работает правильно.
два предложения:

  1. используя базу данных Java вместо webview localstorage, что объяснил @Guillaume Gendre (конечно, у меня это не работает)
  2. локальное хранилище работает как json, поэтому значения хранятся как «ключ: значение». Вы можете добавить уникальный идентификатор своего браузера в его ключ и использовать обычное android localalstorage
MHP
источник
Здравствуй! мы также создали инструмент: кобальт с открытым исходным кодом для создания приложений с несколькими веб-просмотров. Мы усовершенствовали localStorage и добавили плагин pubsub для «общения» между веб-представлениями. ( cobaltians.org )
Гийом Жандр