Vista web de Android y almacenamiento local

Resuelto Thomas asked hace 54 años • 8 respuestas

Tengo un problema con una vista web que puede acceder al almacenamiento local mediante una aplicación HTML5. El archivo test.html me informa que mi navegador no admite el almacenamiento local (es decir, el webview). Si tienes alguna sugerencia..

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; 
        } 
    }
}
Thomas avatar Jan 01 '70 08:01 Thomas
Aceptado

Faltaba lo siguiente:

settings.setDomStorageEnabled(true);
Thomas avatar May 09 '2011 08:05 Thomas

También tuve problemas con la pérdida de datos después de reiniciar la aplicación. Agregar esto ayudó:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
iTake avatar Aug 21 '2012 09:08 iTake

Una solución que funciona en mi Android 4.2.2, compilada con el objetivo de compilación 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 avatar Jul 26 '2014 15:07 AngryWolf

Si su aplicación utiliza varias vistas web, aún tendrá problemas: el almacenamiento local no se comparte correctamente entre todas las vistas web.

Si desea compartir los mismos datos en varias vistas web, la única forma es repararlos con una base de datos java y una interfaz javascript.

Esta página en github muestra cómo hacer esto.

¡espero que esto ayude!

Guillaume Gendre avatar Aug 13 '2013 16:08 Guillaume Gendre