Visualização na Web e local do Android

242

Tenho um problema com uma visualização na web que pode acessar o localStorage por um HTML5aplicativo. O arquivo test.html informa que o armazenamento local não é suportado pelo meu navegador (por exemplo, o webview). Se você tem alguma sugestão ..

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
fonte

Respostas:

517

Faltava o seguinte:

settings.setDomStorageEnabled(true);
Thomas
fonte
1
mesmo :) muito obrigado. Também tive que garantir que você segmentasse pelo menos o Android 2.1 em diante: adicione android: minSdkVersion = "7" ao seu manifesto e altere o Destino da Construção do Projeto (no eclipse) para pelo menos 2,1.
Danmux 19/11/11
45

O método setDatabasePath () foi descontinuado no nível 19. da API. Aconselho que você use o código de idioma de armazenamento como este:

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
fonte
1
@Ram swaroop Talvez o suficiente apenas use setDomStorageEnabled (true) para ativar o armazenamento local para você Talvez você use a última versão do dispositivo e android, e esse problema não surgiu em você, certo? (Talvez o suficiente apenas use setDomStorageEnabled (true) para habilitar o armazenamento local para você), mas algumas versões do android (Exm: old) têm problemas com o armazenamento local após a reinicialização do aplicativo, perdendo esse armazenamento de localidade. Alguém apareceu esse problema e votou na minha resposta. Se você tem alguma idéia, também pode adicionar outra resposta.
mr.boyfox
Eu tentei com a sua solução, mas ainda assim o localStorage não persiste depois que o aplicativo é interrompido / reiniciado, mas algumas vezes após muitas reinicializações, o localStorage continua funcionando e os dados que foram armazenados lá são recuperados corretamente. Isso é incomum, mas isso acontece no meu caso (Testado em Sony Xperia SP).
Ram Patra
@ Ramswaroop Estou usando o Nexus4 e também não tenho problemas com o armazenamento local. Mas quando eu testei no Samsung Galaxy SII, havia esse problema. Não estou dizendo que todos os dispositivos estão funcionando, apenas alguns dispositivos o possuem.
mr.boyfox
25

Também tive problemas com a perda de dados após a reinicialização do aplicativo. Adicionar isso ajudou:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
eu pego
fonte
Ele resolveu o problema de perda de dados, mas o que é isso? Elaborar um pouco?
Sorin Comanescu
da descrição da API: "Para que a API de armazenamento do banco de dados funcione corretamente, esse método deve ser chamado com um caminho no qual o aplicativo possa gravar." developer.android.com/reference/android/webkit/…
iTake
15

Uma solução que funciona no meu Android 4.2.2, compilada com o Android 4.4W de destino da compilação:

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
fonte
4

Se seu aplicativo usar várias visualizações da web, você ainda terá problemas: o localStorage não será compartilhado corretamente em todas as visualizações da web.

Se você deseja compartilhar os mesmos dados em várias visualizações da web, a única maneira é repará-los com um banco de dados java e uma interface javascript.

Esta página no github mostra como fazer isso.

espero que isso ajude!

Guillaume Gendre
fonte
Oi! criamos uma ferramenta em torno dessa correção localStorage e outras coisas interessantes para aplicativos híbridos: cobalto, uma estrutura de código aberto para a criação de aplicativos com várias visualizações da web. Melhoramos o localStorage e adicionamos um plug-in pubsub para "conversar" entre visualizações da web. dê uma olhada no cobaltians.org
Guillaume Gendre
THX. Meu chefe acabou de fazer a mesma pergunta. Isso ajuda.
hsu.tw
0

se você tiver várias visualizações na web, o armazenamento local não funcionará corretamente.
duas sugestões:

  1. usando banco de dados java em vez de armazenamento na web local que "@Guillaume Gendre" explicou (é claro que não funciona para mim)
  2. o armazenamento local funciona como json, portanto, os valores são armazenados como "key: value". você pode adicionar o ID exclusivo do navegador à chave e usar o armazenamento local normal do android
MHP
fonte
Oi! também construímos uma ferramenta: cobalto, uma estrutura de código aberto para a criação de aplicativos com várias visualizações da web. Melhoramos o localStorage e adicionamos um plug-in pubsub para "conversar" entre visualizações da web. ( cobaltians.org )
Guillaume Gendre