एंड्रॉइड वेबव्यू और लोकलस्टोरेज


242

मुझे एक वेबव्यू के साथ एक समस्या है जो एक HTML5ऐप द्वारा लोकलस्टोरेज तक पहुंच सकती है । Test.html फ़ाइल मुझे बताती है कि स्थानीय भंडारण मेरे ब्राउज़र (यानी! webview) द्वारा समर्थित नहीं है । अगर आपके पास कोई सुझाव है ..

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

जवाबों:


518

निम्नलिखित गायब था:

settings.setDomStorageEnabled(true);

1
वही :) बहुत बहुत धन्यवाद। मुझे यह भी सुनिश्चित करना था कि आप कम से कम एंड्रॉइड 2.1 को बाद में लक्षित करें: एंड्रॉइड जोड़ें: minSdkVersion = "7" अपने प्रकट करने के लिए और प्रोजेक्ट बिल्ड लक्ष्य (ग्रहण में) को कम से कम 2.1 करने के लिए बदलें।
danmux

45

setDatabasePath () विधि एपीआई स्तर 19 में पदावनत की गई थी। मैं आपको सलाह देता हूं कि आप इस तरह से स्टोरेज लोकेल का उपयोग करें:

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 शायद पर्याप्त है बस setDomStorageEnabled (सत्य) का उपयोग करें ताकि आप स्थानीय भंडारण को सक्षम कर सकें। हो सकता है कि आप अंतिम संस्करण android और डिवाइस का उपयोग करें, और यह समस्या आपके लिए सही नहीं है? (हो सकता है कि आप बस स्थानीय संग्रहण को सक्षम करने के लिए setDomStorageEnabled (सत्य) का उपयोग करें), लेकिन अनुप्रयोग पुनरारंभ होने के बाद स्थानीय संग्रहण का उपयोग करके Android के कुछ संस्करणों (Exm: पुराना) की समस्या इस स्थानीय भंडारण को खो देती है। किसी को यह समस्या दिखाई दी और उन्होंने मेरे जवाब को वोट दिया। यदि आपके पास कोई विचार है तो आप एक और उत्तर भी जोड़ सकते हैं।
mr.boyfox

मैंने आपके समाधान के साथ कोशिश की, लेकिन फिर भी लोकलस्टोरेज ऐप के मारे जाने / फिर से शुरू होने के बाद नहीं बना रहता है, लेकिन कभी-कभी कई रीस्टार्ट होने के बाद लोकलस्टोरेज काम करना शुरू कर देता है और जो डेटा स्टोर किया गया था, उसे सही तरीके से पुनर्प्राप्त किया जाता है। यह असामान्य है, लेकिन यह मेरे मामले में होता है। (सोनी एक्सपीरिया एसपी पर परीक्षण)
राम पत्र

@Ramswaroop मैं Nexus4 का उपयोग कर रहा हूं और मुझे स्थानीय भंडारण से भी कोई समस्या नहीं है। लेकिन जब मैंने सैमसंग गैलेक्सी SII पर परीक्षण किया तो यह समस्या थी। मैं यह नहीं कह रहा हूं कि सभी डिवाइस काम कर रहे हैं, बस कुछ डिवाइस में यह है।
mr.boyfox

25

अनुप्रयोग के पुनः आरंभ होने के बाद डेटा खो जाने की मुझे भी समस्या है। इससे मदद मिली:

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

यह डेटा हानि की समस्या को हल करता है लेकिन यह क्या है? थोड़ा विस्तार करें?
सोरिन कोमेनेस्कु

एपीआई विवरण से: "डेटाबेस स्टोरेज एपीआई को सही ढंग से काम करने के लिए, इस पद्धति को एक पथ के साथ बुलाया जाना चाहिए, जिस पर एप्लिकेशन लिख सकता है।" developer.android.com/reference/android/webkit/…
iTake

15

एक समाधान जो मेरे एंड्रॉइड 4.2.2 पर काम करता है, बिल्ड टारगेट एंड्रॉइड 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());
}

4

यदि आपका ऐप कई वेबव्यू का उपयोग करता है, तो आपको अभी भी परेशानी होगी: सभी वेब साक्षात्कारों में लोकलस्टोरेज को सही ढंग से साझा नहीं किया जाता है।

यदि आप एक ही डेटा को कई वेबव्यू में साझा करना चाहते हैं, तो एकमात्र तरीका यह है कि इसे जावा डेटाबेस और जावास्क्रिप्ट इंटरफ़ेस के साथ ठीक किया जाए।

इस पृष्ठ पर github दिखाता है कि यह कैसे करना है।

उममीद है कि इससे मदद मिलेगी!


नमस्ते! हमने इस लोकलस्टोरेज फिक्स और हाइब्रिड ऐप्स के लिए कुछ अन्य बढ़िया सामानों के आसपास एक टूल बनाया: कोबाल्ट, कई वेबव्यूस के साथ ऐप बनाने के लिए एक ओपन सोर्स फ्रेमवर्क। हमने लोकलस्टोरेज को बढ़ाया और वेबवार्ता के बीच "टॉक" के लिए एक पबबस प्लगइन जोड़ा। cobaltians.org
गिलियूम गेंड्रे

धन्यवाद। मेरे बॉस ने बस यही सवाल पूछा। यह मदद करता है।
hsu.tw

0

यदि आपके पास कई वेबव्यू हैं, तो स्थानीयस्टोर सही तरीके से काम नहीं करता है।
दो सुझाव:

  1. इसके बजाय java डेटाबेस का उपयोग करके वेबव्यू लोकलस्टोर में "@Guillaume Gendre" के बारे में बताया गया है। (निश्चित रूप से यह इसके लिए उपयोगी नहीं है)
  2. स्थानीय भंडारण कार्य जैसे कि जोंस, इसलिए मान "की: वैल्यू" के रूप में स्टोर होते हैं। आप अपने ब्राउज़र को इसकी कुंजी और विशिष्ट एंड्रॉइड लोकलस्टोरेज का उपयोग करके अद्वितीय आईडी जोड़ सकते हैं

नमस्ते! हमने एक उपकरण भी बनाया है: कई वेब साक्षात्कारों वाले ऐप्स के निर्माण के लिए एक खुला स्रोत ढांचा। हमने लोकलस्टोरेज को बढ़ाया और वेबवार्ता के बीच "टॉक" के लिए एक पबबस प्लगइन जोड़ा। ( cobaltians.org )
गिलियूम गेंड्रे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.