Android web görünümü ve yerel


242

Bir HTML5uygulama tarafından localStorage erişebilir bir web görünümü ile ilgili bir sorun var . Test.html dosyası, yerel depolama biriminin tarayıcım (yani. webview) Tarafından desteklenmediğini bildirir . Eğer herhangi bir öneriniz varsa ..

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

Yanıtlar:


518

Aşağıdaki eksikti:

settings.setDomStorageEnabled(true);

1
Aynı :) çok teşekkürler. Ayrıca, en azından Android 2.1'den sonra hedeflediğinizden emin olmak zorunda kaldım: manifestinize android: minSdkVersion = "7" ekleyin ve en azından 2.1 olarak Proje Oluşturma Hedefini değiştirin.
danmux

45

setDatabasePath () yöntemi API 19 düzeyinde kullanımdan kaldırıldı. Depolama yerel ayarını şu şekilde kullanmanızı öneririm:

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 Belki de sadece size yerel depolama sağlamak için setDomStorageEnabled (true) kullanın Belki son sürümü android ve cihaz kullanın ve bu sorun size doğmadı değil mi? (Belki de size yerel depolamayı etkinleştirmek için setDomStorageEnabled (true) öğesini kullanın), ancak uygulama yeniden başlatıldıktan sonra yerel depolamayı kullanan android (Exm: eski) sorunun bazı sürümleri bu yerel depolama alanını kaybetti. Birisi bu problemi ortaya çıkardı ve cevabımı oyladılar. Herhangi bir fikriniz varsa, başka bir cevap da ekleyebilirsiniz.
mr.boyfox

Ben çözüm ile çalıştı ama app öldürüldükten / yeniden başlatıldıktan sonra hala localStorage devam etmez ama bazen birçok yeniden başlatıldıktan sonra localStorage çalışmaya devam eder ve orada saklanan veriler doğru şekilde alınır. Bu olağandışı ama benim durumumda oluyor. (Sony Xperia SP üzerinde test edildi)
Ram Patra

@Ramswaroop Nexus4 kullanıyorum ve ayrıca yerel depolama ile ilgili bir sorunum yok. Ancak Samsung Galaxy SII'yi test ettiğimde bu sorun vardı. Tüm cihazların çalıştığını söylemiyorum, sadece bazı cihazlarda var.
mr.boyfox

25

Ayrıca uygulama yeniden başlatıldıktan sonra veri kaybı ile ilgili sorun yaşadım. Bunu eklemek yardımcı oldu:

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

Veri kaybı problemini çözdü ama bu nedir? Biraz ayrıntılı mı?
Sorin Comanescu

from API description: "Veritabanı depolama API'sının düzgün çalışması için bu yöntemin uygulamanın yazabileceği bir yolla çağrılması gerekir." developer.android.com/reference/android/webkit/…
iTake

15

Android 4.2.2 oluşturma hedefiyle derlenen Android 4.2.2 üzerinde çalışan bir çözüm:

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

Uygulamanız birden çok web görünümü kullanıyorsa sorun yaşamaya devam edersiniz: localStorage tüm web görünümleri arasında doğru şekilde paylaşılmaz.

Aynı verileri birden çok web görünümünde paylaşmak istiyorsanız, tek yol bir java veritabanı ve bir javascript arayüzü ile onarmaktır.

Github'daki bu sayfa bunun nasıl yapılacağını gösterir.

umarım bu yardım!


Selam! hibrit uygulamalar için bu localStorage düzeltmesi ve diğer bazı harika şeyler etrafında bir araç oluşturduk: kobalt, birden çok web görüntülemesine sahip uygulamalar oluşturmak için açık kaynaklı bir çerçeve. LocalStorage'ı geliştirdik ve web görünümleri arasında "konuşmak" için bir pubsub eklentisi ekledik. cobaltians.org'a
Guillaume

TEŞEKKÜRLER. Patronum da aynı soruyu sordu. Bu yardım.
hsu.tw

0

birden fazla web görünümünüz varsa, localstorage düzgün çalışmıyor.
iki öneri:

  1. java veritabanı kullanarak webview localstorage "@Guillaume Gendre" açıkladı. (tabii ki benim için çalışmıyor)
  2. json gibi yerel depolama işleri, bu yüzden değerler "anahtar: değer" olarak saklar. tarayıcınızın benzersiz kimliğini anahtarına ve normal android localstorage'ı kullanarak ekleyebilirsiniz

Selam! ayrıca bir araç geliştirdik: kobalt, birden çok web görünümüne sahip uygulamalar oluşturmak için açık kaynaklı bir çerçeve. LocalStorage'ı geliştirdik ve web görünümleri arasında "konuşmak" için bir pubsub eklentisi ekledik. ( Cobaltians.org )
Guillaume gendre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.