Chế độ xem web & localStorage trên Android


242

Tôi có một vấn đề với một webview có thể truy cập vào localStorage bởi một HTML5ứng dụng. Tệp test.html thông báo cho tôi rằng bộ nhớ cục bộ không được trình duyệt của tôi hỗ trợ (ví dụ webview:). Nếu bạn có bất kỳ đề nghị ..

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

Câu trả lời:


517

Sau đây là mất tích:

settings.setDomStorageEnabled(true);

1
cùng :) cảm ơn rất nhiều Tôi cũng phải đảm bảo rằng bạn nhắm mục tiêu ít nhất là Android 2.1 trở đi: thêm android: minSdkVersion = "7" vào bảng kê khai của bạn và thay đổi ít nhất là Project Build Target (trong nhật thực) thành 2.1.
danmux

45

Phương thức setDatabasePath () không được dùng ở cấp độ API 19. Tôi khuyên bạn nên sử dụng ngôn ngữ lưu trữ như thế này:

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 Có lẽ chỉ cần sử dụng setDomStorageEnables (true) để kích hoạt bộ nhớ cục bộ cho bạn Có thể bạn sử dụng phiên bản android và thiết bị mới nhất và vấn đề này chưa xảy ra với bạn phải không? (Có thể chỉ cần sử dụng setDomStorageEnables (true) để bật bộ nhớ cục bộ cho bạn), nhưng một số phiên bản của vấn đề android (Exm: cũ) sử dụng bộ nhớ cục bộ sau khi khởi động lại ứng dụng đã mất bộ nhớ cục bộ này. Ai đó đã xuất hiện vấn đề này và họ bỏ phiếu cho câu trả lời của tôi. Nếu bạn có bất kỳ ý tưởng, bạn cũng có thể thêm một câu trả lời.
mr.boyfox

Tôi đã thử với giải pháp của bạn nhưng vẫn localStorage không tồn tại sau khi ứng dụng bị tắt / khởi động lại nhưng đôi khi sau nhiều lần khởi động lại, localStorage tiếp tục hoạt động và dữ liệu đã được lưu trữ ở đó được truy xuất chính xác. Điều này là bất thường nhưng nó xảy ra trong trường hợp của tôi. (Đã thử nghiệm trên Sony Xperia SP)
Ram Patra

@Ramswaroop Tôi đang sử dụng Nexus4 và tôi cũng không gặp vấn đề gì với bộ nhớ cục bộ. Nhưng khi tôi thử nghiệm trên Samsung Galaxy SII thì đã có vấn đề này. Tôi không nói rằng tất cả các thiết bị đang hoạt động như vậy, chỉ một số thiết bị có nó.
mr.boyfox

25

Tôi cũng gặp vấn đề với việc mất dữ liệu sau khi khởi động lại ứng dụng. Thêm điều này đã giúp:

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

Nó giải quyết vấn đề mất dữ liệu nhưng đây là gì? Xây dựng một chút?
Sorin Comanescu

từ mô tả API: "Để API lưu trữ cơ sở dữ liệu hoạt động chính xác, phương thức này phải được gọi với một đường dẫn mà ứng dụng có thể viết." developer.android.com/reference/android/webkit/
trộm

15

Một giải pháp hoạt động trên Android 4.2.2 của tôi, được biên dịch với mục tiêu xây dựng 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

Nếu ứng dụng của bạn sử dụng nhiều webview, bạn vẫn sẽ gặp sự cố: localStorage không được chia sẻ chính xác trên tất cả các lần xem web.

Nếu bạn muốn chia sẻ cùng một dữ liệu trong nhiều lần xem web, cách duy nhất là sửa chữa nó bằng cơ sở dữ liệu java và giao diện javascript.

Trang này trên github cho thấy làm thế nào để làm điều này.

hy vọng điều này giúp đỡ!


Chào! chúng tôi đã xây dựng một công cụ xung quanh bản sửa lỗi LocalStorage này và một số nội dung thú vị khác cho các ứng dụng lai: coban, một khung nguồn mở để xây dựng các ứng dụng có nhiều lần xem web. Chúng tôi đã tăng cường localStorage và thêm plugin pubsub để "nói chuyện" giữa các lần xem web. hãy xem cobaltians.org
Guillaume Gendre

CÁM ƠN. Ông chủ của tôi chỉ hỏi cùng một câu hỏi. Điều này giúp.
hsu.tw

0

nếu bạn có nhiều webview, localst Storage không hoạt động chính xác.
hai đề nghị:

  1. sử dụng cơ sở dữ liệu java thay vì lưu trữ cục bộ webview mà "@Guillaume Gendre" đã giải thích. (tất nhiên nó không hoạt động với tôi)
  2. bộ nhớ cục bộ hoạt động như json, vì vậy các giá trị lưu trữ dưới dạng "key: value". Bạn có thể thêm id duy nhất của trình duyệt vào khóa của nó và sử dụng bộ lưu trữ cục bộ Android bình thường

Chào! chúng tôi cũng đã xây dựng một công cụ: coban một khung nguồn mở để xây dựng các ứng dụng có nhiều lần xem web. Chúng tôi đã tăng cường localStorage và thêm plugin pubsub để "nói chuyện" giữa các lần xem web. ( cobaltians.org )
Guillaume Gendre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.