Android webview & localStorage


242

ฉันมีปัญหากับ webview ซึ่งอาจเข้าถึงHTML5แอพlocalStorage โดยแอป ไฟล์ 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
กัน :) ขอบคุณมาก ฉันต้องทำให้แน่ใจว่าคุณกำหนดเป้าหมายอย่างน้อย Android 2.1 เป็นต้นไป: เพิ่ม android: minSdkVersion = "7" ในไฟล์ Manifest ของคุณและเปลี่ยน Project Build Target (ใน eclipse) เป็นอย่างน้อย 2.1
danmux

45

setDatabasePath ()วิธีการเลิกในระดับ API 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: old) ในการใช้ที่จัดเก็บในตัวเครื่องหลังจากรีสตาร์ทแอปพลิเคชันหายไป มีคนปรากฏปัญหานี้และพวกเขาลงคะแนนให้กับคำตอบของฉัน หากคุณมีความคิดคุณสามารถเพิ่มคำตอบได้อีกด้วย
mr.boyfox

ฉันลองใช้วิธีแก้ปัญหาของคุณ แต่ยังคง localStorage ไม่คงอยู่หลังจากที่แอปถูกฆ่า / เริ่มใหม่ แต่บางครั้งหลังจากรีสตาร์ทหลายครั้ง localStorage จะกลับมาทำงานต่อและข้อมูลที่ถูกเก็บไว้มีการเรียกคืนอย่างถูกต้อง มันผิดปกติ แต่มันเกิดขึ้นในกรณีของฉัน (ทดสอบบน Sony Xperia SP)
Ram Patra

@Ramswaroop ฉันใช้ Nexus4 และฉันก็ไม่มีปัญหากับที่จัดเก็บในตัวเครื่อง แต่เมื่อฉันทดสอบกับ Samsung Galaxy SII มีปัญหานี้ ฉันไม่ได้บอกว่าอุปกรณ์ทั้งหมดใช้งานได้ แต่มีบางอุปกรณ์เท่านั้น
mr.boyfox

25

ฉันยังมีปัญหาข้อมูลสูญหายหลังจากรีสตาร์ทแอปพลิเคชัน การเพิ่มสิ่งนี้ช่วย:

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

มันแก้ไขปัญหาการสูญหายของข้อมูล แต่นี่คืออะไร ทำอย่างละเอียดสักเล็กน้อย?
Sorin Comanescu

จากคำอธิบาย API: "เพื่อให้ API ที่จัดเก็บฐานข้อมูลทำงานได้อย่างถูกต้องต้องเรียกใช้วิธีนี้พร้อมกับเส้นทางที่แอปพลิเคชันสามารถเขียนได้" developer.android.com/reference/android/webkit/
iTake

15

โซลูชันที่ทำงานบน Android 4.2.2 ของฉันรวบรวมโดย build เป้าหมาย 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());
}

4

หากแอปของคุณใช้หลายการดูเว็บคุณจะยังคงมีปัญหา: localStorage ไม่ได้แชร์อย่างถูกต้องกับ webviews ทั้งหมด

หากคุณต้องการแบ่งปันข้อมูลเดียวกันในหลาย webviews วิธีเดียวคือการซ่อมแซมด้วยฐานข้อมูล java และส่วนต่อประสาน javascript

หน้า GitHub นี้แสดงให้เห็นถึงวิธีการทำเช่นนี้

หวังว่าความช่วยเหลือนี้!


Hi! เราได้สร้างเครื่องมือในการแก้ไขการจัดเก็บข้อมูลในเครื่องนี้แล้วยังมีสิ่งดีๆอื่น ๆ สำหรับแอพไฮบริด: โคบอลต์กรอบโอเพ่นซอร์สสำหรับการสร้างแอพที่มีหลาย webviews เราปรับปรุง LocalStorage และเพิ่มปลั๊กอิน pubsub เป็น "พูดคุย" ระหว่างการดูเว็บ ไปดูcobaltians.org
Guillaume Gendre

ขอบคุณ. เจ้านายของฉันเพิ่งถามคำถามเดียวกัน ความช่วยเหลือนี้
hsu.tw

0

ถ้าคุณมีหลาย webview localstorage ทำงานไม่ถูกต้อง
สองข้อเสนอแนะ:

  1. ใช้ฐานข้อมูล java แทน webview localstorage ที่อธิบายว่า "@Guillaume Gendre" (แน่นอนว่ามันไม่ได้ผลสำหรับฉัน)
  2. ที่จัดเก็บในตัวเครื่องทำงานเหมือน json ดังนั้นค่าที่จัดเก็บเป็น "key: value" คุณสามารถเพิ่มรหัสเฉพาะเบราว์เซอร์ของคุณลงในคีย์ของมันและใช้ Android localstorage ปกติ

Hi! นอกจากนี้เรายังสร้างเครื่องมือ: โคบอลต์เฟรมเวิร์กโอเพนซอร์ซสำหรับการสร้างแอพที่มีหลาย webviews เราปรับปรุง LocalStorage และเพิ่มปลั๊กอิน pubsub เป็น "พูดคุย" ระหว่างการดูเว็บ ( cobaltians.org )
Guillaume Gendre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.