Tampilan web Android & penyimpanan lokal

242

Saya memiliki masalah dengan tampilan web yang dapat mengakses ke localStorage oleh HTML5aplikasi. File test.html memberi tahu saya bahwa penyimpanan lokal tidak didukung oleh browser saya (mis. The webview). Jika Anda punya saran ..

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
sumber

Jawaban:

518

Berikut ini tidak ada:

settings.setDomStorageEnabled(true);
Thomas
sumber
1
sama :) terima kasih banyak. Saya juga harus memastikan Anda menargetkan setidaknya Android 2.1 dan seterusnya: tambahkan android: minSdkVersion = "7" ke manifes Anda dan ubah Project Build Target (dalam gerhana) menjadi 2.1 setidaknya.
danmux
45

metode setDatabasePath () sudah tidak digunakan lagi di API level 19. Saya menyarankan Anda untuk menggunakan penyimpanan lokal seperti ini:

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
sumber
1
@Ram swaroop Mungkin cukup cukup gunakan setDomStorageEnabled (true) untuk memungkinkan penyimpanan lokal untuk Anda. Mungkin Anda menggunakan Android versi terakhir dan perangkat, dan masalah ini belum muncul pada Anda kan? (Mungkin cukup menggunakan setDomStorageEnabled (true) untuk mengaktifkan penyimpanan lokal untuk Anda), tetapi beberapa versi android (Exm: old) masalah menggunakan penyimpanan lokal setelah aplikasi restart kehilangan penyimpanan lokal ini. Seseorang muncul masalah ini dan mereka memberikan suara untuk jawaban saya. Jika Anda punya ide, Anda dapat menambahkan jawaban lain juga.
mr.boyfox
saya mencoba dengan solusi Anda tetapi tetap localStorage tidak bertahan setelah aplikasi terbunuh / restart tetapi kadang-kadang setelah banyak me-restart localStorage melanjutkan bekerja dan data yang telah disimpan di sana diambil dengan benar. Ini tidak biasa tetapi ini terjadi dalam kasus saya. (Diuji pada Sony Xperia SP)
Ram Patra
@Ramswaroop Saya menggunakan Nexus4 dan saya juga tidak punya masalah dengan penyimpanan lokal. Tetapi ketika saya diuji pada Samsung Galaxy SII ada masalah ini. Saya tidak mengatakan semua perangkat berfungsi dengan baik, hanya beberapa perangkat yang memilikinya.
mr.boyfox
25

Saya juga punya masalah dengan data yang hilang setelah aplikasi di-restart. Menambahkan ini membantu:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
saya ambil
sumber
Ini memecahkan masalah kehilangan data tetapi apa ini? Rumit sedikit?
Sorin Comanescu
dari uraian API: "Agar API penyimpanan basis data berfungsi dengan benar, metode ini harus dipanggil dengan jalur yang dapat ditulis aplikasi." developer.android.com/reference/android/webkit/…
iTake
15

Solusi yang bekerja di Android 4.2.2 saya, yang dikompilasi dengan build target 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
sumber
4

Jika aplikasi Anda menggunakan beberapa tampilan web, Anda masih akan mengalami masalah: localStorage tidak dibagikan dengan benar di semua tampilan web.

Jika Anda ingin berbagi data yang sama dalam beberapa tampilan web, satu-satunya cara adalah memperbaikinya dengan basis data java dan antarmuka javascript.

Halaman ini di github menunjukkan cara melakukan ini.

semoga ini membantu!

Guillaume Gendre
sumber
Hai! kami membuat alat di sekitar perbaikan Penyimpanan lokal ini dan beberapa hal keren lainnya untuk aplikasi hybrid: cobalt, kerangka kerja open source untuk membangun aplikasi dengan beberapa tampilan web. Kami meningkatkan penyimpanan lokal dan menambahkan plugin pubsub untuk "berbicara" antara tampilan web. lihat di cobaltians.org
Guillaume Gendre
TERIMA KASIH. Bos saya hanya menanyakan pertanyaan yang sama. Ini bantuan.
hsu.tw
0

jika Anda memiliki beberapa tampilan web, penyimpanan lokal tidak berfungsi dengan benar.
dua saran:

  1. menggunakan database java sebagai gantinya webview localstorage yang dijelaskan "@Guillaume Gendre" (tentu saja itu tidak berfungsi untuk saya)
  2. penyimpanan lokal bekerja seperti json, sehingga nilai menyimpan sebagai "key: value" .Anda dapat menambahkan id unik browser Anda ke kunci itu dan menggunakan penyimpanan lokal Android normal
MHP
sumber
Hai! kami juga membangun alat: cobalt kerangka sumber terbuka untuk membangun aplikasi dengan banyak tampilan web. Kami meningkatkan penyimpanan lokal dan menambahkan plugin pubsub untuk "berbicara" antara tampilan web. ( cobaltians.org )
Guillaume Gendre