Android webview i localStorage

242

Mam problem z widokiem internetowym, który może uzyskać dostęp do localStorage przez HTML5aplikację. Plik test.html informuje mnie, że pamięć lokalna nie jest obsługiwana przez moją przeglądarkę (tj. webview). Jeśli masz jakieś sugestie ...

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; 
    } 
}
} 
Tomasz
źródło

Odpowiedzi:

518

Brakowało:

settings.setDomStorageEnabled(true);
Tomasz
źródło
1
to samo :) wielkie dzięki. Musiałem także upewnić się, że celujesz przynajmniej w system Android 2.1: dodaj android: minSdkVersion = "7" do manifestu i zmień wartość docelową kompilacji projektu (w środowisku Eclipse) na przynajmniej 2.1.
danmux,
45

Metoda setDatabasePath () została uznana za przestarzałą w interfejsie API na poziomie 19. Radzę używać ustawień narodowych pamięci masowej w następujący sposób:

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
źródło
1
@Ram swaroop Może wystarczy użyć po prostu setDomStorageEnabled (true), aby włączyć przechowywanie lokalne. Może używasz ostatniej wersji Androida i urządzenia, a ten problem nie pojawił się u ciebie, prawda? (Być może wystarczy użyć setDomStorageEnabled (true), aby włączyć pamięć lokalną), ale niektóre wersje Androida (np. Stary) problem z pamięcią lokalną po ponownym uruchomieniu aplikacji straciły pamięć lokalną. Ktoś pojawił się ten problem i zagłosowali na moją odpowiedź. Jeśli masz jakiś pomysł, możesz także dodać inną odpowiedź.
mr.boyfox
Próbowałem z twoim rozwiązaniem, ale nadal localStorage nie utrzymuje się po zabiciu / ponownym uruchomieniu aplikacji, ale czasami po wielu ponownych uruchomieniach localStorage wznawia działanie, a dane, które zostały tam zapisane, są poprawnie pobierane. Jest to niezwykłe, ale zdarza się w moim przypadku. (Testowane na Sony Xperia SP)
Ram Patra
@Ramswaroop Korzystam z Nexus4 i nie mam też problemu z pamięcią lokalną. Ale kiedy testowałem na Samsung Galaxy SII, pojawił się ten problem. Nie twierdzę, że wszystkie urządzenia działają, tylko niektóre mają to.
mr.boyfox
25

Miałem również problem z utratą danych po ponownym uruchomieniu aplikacji. Dodanie tego pomogło:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
biorę
źródło
Rozwiązał problem utraty danych, ale co to jest? Opracować trochę?
Sorin Comanescu
z opisu interfejsu API: „Aby interfejs API pamięci bazy danych działał poprawnie, należy wywołać tę metodę ze ścieżką, do której aplikacja może zapisywać.” developer.android.com/reference/android/webkit/…
iTake
15

Rozwiązanie, które działa na moim Androidzie 4.2.2, skompilowane z docelową wersją Androida 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
źródło
4

Jeśli Twoja aplikacja korzysta z wielu widoków internetowych, nadal będziesz mieć problemy: localStorage nie jest poprawnie udostępniany we wszystkich widokach internetowych.

Jeśli chcesz udostępniać te same dane w wielu widokach internetowych, jedynym sposobem jest ich naprawa za pomocą bazy danych Java i interfejsu javascript.

Ta strona na github pokazuje, jak to zrobić.

Mam nadzieję, że to pomoże!

Guillaume Gendre
źródło
Cześć! zbudowaliśmy narzędzie wokół tej poprawki localStorage i kilku innych ciekawych rzeczy dla aplikacji hybrydowych: kobalt, platforma open source do tworzenia aplikacji z wieloma widokami internetowymi. Ulepszyliśmy localStorage i dodaliśmy wtyczkę pubsub do „rozmowy” między przeglądami stron. spójrz na cobaltians.org
Guillaume Gendre
DZIĘKI. Mój szef właśnie zadał to samo pytanie. Ta pomoc
hsu.tw
0

jeśli masz wiele widoków, przechowywanie lokalne nie działa poprawnie.
dwie sugestie:

  1. używając bazy danych Java zamiast webview localstorage, który wyjaśnił „@Guillaume Gendre” (oczywiście to nie działa dla mnie)
  2. pamięć lokalna działa jak json, więc wartości są zapisywane jako „klucz: wartość”. możesz dodać unikalny identyfikator przeglądarki do jego klucza i używając zwykłego magazynu lokalnego Androida
MHP
źródło
Cześć! stworzyliśmy również narzędzie: kobalt - platforma open source do tworzenia aplikacji z wieloma widokami internetowymi. Ulepszyliśmy localStorage i dodaliśmy wtyczkę pubsub do „rozmowy” między przeglądami stron. ( cobaltians.org )
Guillaume Gendre