Webview Android e archivio locale


242

Ho un problema con una webview che può accedere al LocalStorage da HTML5un'app. Il file test.html mi informa che la memoria locale non è supportata dal mio browser (es. Il webview). Se hai qualche suggerimento ..

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; 
    } 
}
} 

Risposte:


518

Mancava quanto segue:

settings.setDomStorageEnabled(true);

1
stesso :) grazie mille. Ho anche dovuto assicurarmi di indirizzare almeno Android 2.1 in poi: aggiungi android: minSdkVersion = "7" al tuo manifest e modifica il Target di Build del progetto (in eclissi) almeno 2.1.
danmux,

45

Il metodo setDatabasePath () è stato deprecato nel livello API 19. Ti consiglio di usare le impostazioni locali di archiviazione in questo modo:

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/");
}

1
@Ram swaroop Forse basta usare setDomStorageEnabled (true) per abilitare l'archiviazione locale su di te Forse usi l'ultima versione di Android e dispositivo, e questo problema non si è presentato a te giusto? (Forse basta usare setDomStorageEnabled (true) per abilitare l'archiviazione locale), ma alcune versioni del problema Android (Exm: vecchio) che utilizzano l'archiviazione locale dopo il riavvio dell'applicazione hanno perso l'archiviazione locale. Qualcuno ha riscontrato questo problema e votano alla mia risposta. Se hai idea puoi anche aggiungere un'altra risposta.
mr.boyfox,

ho provato con la tua soluzione, ma localStorage non persiste dopo che l'app è stata uccisa / riavviata, ma a volte dopo molti riavvii localStorage riprende a funzionare e i dati che sono stati memorizzati lì vengono recuperati correttamente. Questo è insolito, ma succede nel mio caso. (Testato su Sony Xperia SP)
Ram Patra,

@Ramswaroop Sto usando Nexus4 e non ho problemi con l'archiviazione locale. Ma quando ho provato sul Samsung Galaxy SII c'era questo problema. Non sto dicendo che tutti i dispositivi funzionino così, solo alcuni dispositivi ce l'hanno.
mr.boyfox,

25

Ho anche avuto problemi con la perdita di dati dopo il riavvio dell'applicazione. L'aggiunta di questo ha aiutato:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");

Ha risolto il problema della perdita di dati, ma cos'è questo? Elaborare un po '?
Sorin Comanescu,

dalla descrizione dell'API: "Affinché l'API di archiviazione del database funzioni correttamente, questo metodo deve essere chiamato con un percorso su cui l'applicazione può scrivere." developer.android.com/reference/android/webkit/…
iTake

15

Una soluzione che funziona sul mio Android 4.2.2, compilata con Android 4.4W target di build:

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());
}

4

Se la tua app utilizza più visualizzazioni Web, avrai comunque problemi: localStorage non viene condiviso correttamente in tutte le visualizzazioni Web.

Se si desidera condividere gli stessi dati in più visualizzazioni Web, l'unico modo è ripristinarli con un database java e un'interfaccia javascript.

Questa pagina su github mostra come farlo.

spero che questo aiuto!


Ciao! abbiamo creato uno strumento attorno a questa soluzione di archiviazione locale e alcune altre cose interessanti per le app ibride: cobalto, un framework open source per la creazione di app con più visualizzazioni Web. Abbiamo migliorato localStorage e aggiunto un plugin pubsub per "parlare" tra le visualizzazioni web. dai un'occhiata a cobaltians.org
Guillaume Gendre il

GRAZIE. Il mio capo ha appena fatto la stessa domanda. Questo aiuto
hsu.tw,

0

se si dispone di più visualizzazioni Web, localstorage non funziona correttamente.
due suggerimenti:

  1. usando il database java invece webview localstorage spiegato da "@Guillaume Gendre" (ovviamente non funziona per me)
  2. l'archiviazione locale funziona come json, quindi i valori vengono archiviati come "chiave: valore". Puoi aggiungere l'ID univoco del browser alla sua chiave e utilizzare il normale archivio locale Android

Ciao! abbiamo anche creato uno strumento: cobalto un framework open source per la creazione di app con più visualizzazioni Web. Abbiamo migliorato localStorage e aggiunto un plugin pubsub per "parlare" tra le visualizzazioni web. ( cobaltians.org )
Guillaume Gendre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.