2011-12-05 35 views
16

Tôi có một trang thử nghiệm html5 đơn giản sử dụng LocalStorage để hiển thị/lưu/hiển thị lại một đoạn dữ liệu.Android 4.0.1 phá vỡ WebView HTML 5 lưu trữ cục bộ?

Mã này hoạt động hoàn hảo trong Android 2.3.x nhưng nhật ký ngoại lệ trong 4.0.1 trên dòng 18 của html là cú pháp gọi là localStorage.getItem() và tại thời điểm này JS dừng lại.

Ngoại lệ: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 Tôi cũng đã thử đặt đường dẫn cơ sở dữ liệu thành getCacheDir() với cùng một kết quả.

String htmlContent = "HTML content listed below";  
File sharedDir = getActivity().getDir("htmlData", Context.MODE_PRIVATE); 
WebView browser = (WebView)v.findViewById(R.id.wvBrowser); 

browser.setWebChromeClient(new WebChromeClient(){ 
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
      quotaUpdater.updateQuota(estimatedSize * 2); 
     } 
    });  
browser.setWebViewClient(new WebViewClient(){ 
    @Override 
    public void onPageFinished(WebView view, String url){ 

     view.loadUrl("javascript:doTest()"); 

    }); 

browser.getSettings().setDatabaseEnabled(true); 
browser.getSettings().setDatabasePath(sharedDir.getPath()); 
browser.getSettings().setDomStorageEnabled(true); 
browser.loadDataWithBaseURL(mSharedDir.getPath(), 
      htmlContent, 
      "text/html", 
      "utf-8", 
      null); 

HTML mà trang được render như sau:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Simple localStorage test</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script type="text/javascript"> 

     function doTest() { 
      $('#stuff').append('<p>reading</p>'); 
      var item = read(); 

      $('#stuff').append('<p>writing</p>'); 
      localStorage['bar'] = new Date().toUTCString(); 

      $('#stuff').append('<p>&nbsp;</p><p>reading again</p>'); 
      read(); 
     } 
     function read() { 
      var item = localStorage.getItem('bar'); 
      if (item == null || (item == undefined)) { 
       item = ''; 
      } 
      $('#stuff').append('<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item: ' + item + '</p>'); 

     return item; 
     } 
    </script> 
</head> 
<body> 
    <p>-Simple localStorage test-</p> 
    <div id="stuff"></div> 
</body> 
</html> 

Nguồn sẵn here

+0

Ngoại lệ được ghi lại là gì? – CommonsWare

+0

Xin lỗi, điều đó sẽ hữu ích - được thêm vào câu hỏi – MrChaz

+0

Thật lạ lùng. Nếu bạn có một dự án mẫu hoàn chỉnh, bạn có thể đóng gói và tải lên một nơi nào đó, tôi muốn xem xét nó. – CommonsWare

Trả lời

11

Qua một số cuộc thảo luận với Google kỹ sư có vẻ như họ đã thực hiện các quyết định rằng tệp: // scheme không an toàn.

Một tác phẩm xung quanh việc này là phải làm như sau

browser.loadDataWithBaseURL("http://www.example.com", 
      htmlContent, 
      "text/html", 
      "utf-8", 
      null); 
+0

Cảm ơn! Tôi yêu bạn <3 – Aballano

+0

Cảm ơn rất nhiều câu trả lời, nó cũng đã giải quyết các truy vấn của tôi về lỗi không bắt buộc: SECURITY_ERR: Ngoại lệ DOM 18: 2. –

4

Đối với phiên bản Android dưới 4.4, dữ liệu tải vào một webview với một sơ đồ như một thư mục:

browser.loadDataWithBaseUrl("file:///android_asset/", html, "text/html", "UTF-8", null); 

wont work với localStorage. Nếu tôi thêm tên tệp, nó hoạt động trên các phiên bản hệ điều hành cũ hơn

browser.loadDataWithBaseUrl("file:///android_asset/test.html", html, "text/html", "UTF-8", null); 
+0

Unbelievable ... Trong trường hợp của tôi, ứng dụng đang sử dụng API 12, để chạy từ Android 3.1 mà không có setAllowUniversalAccessFromFileURLs (http://stackoverflow.com/questions/19379392/jquery-mobile-not-working-in- webview-khi-loading-from-local-assets) để đặt thành true, do đó, trang trống trên 4.2. Với điều đó bây giờ tất cả đều ổn. –

Các vấn đề liên quan