2015-05-05 24 views
6

Tôi có một chế độ xem web trên Android, mà tôi tin rằng có mọi thứ cần thiết để truy cập và sử dụng localStorage, tuy nhiên, tôi thấy lỗi "Truy cập bị từ chối" trong bảng điều khiển khi cố gắng sử dụng lưu trữ cục bộ. Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.Truy cập bị từ chối bằng cách sử dụng bộ nhớ cục bộ trong Android WebView

Có ai có thể phát hiện sự cố không?

Javascript Code:

function localStorageTest() { 
    // Check browser support 
    if (typeof(Storage) != "undefined") { 
    // Store 
    localStorage.setItem("lastname", "Smith"); 
    // Retrieve 
    document.getElementById("console").innerHTML = localStorage.getItem("lastname"); 
    } else { 
    document.getElementById("console").innerHTML = "Sorry, your browser does not support Web Storage..."; 
    } 
} 

Dưới đây là mã Android:

// Enable javascript 
    WebSettings settings = getSettings(); 
    settings.setJavaScriptEnabled(true); 
    settings.setDomStorageEnabled(true); 
    settings.setDatabaseEnabled(true); 

    // Create database folder 
    String databasePath = getContext().getDir("databases", Context.MODE_PRIVATE).getPath(); 
    getSettings().setDatabasePath(databasePath); 

    getContext().getPackageName() + "/databases/"); 

    settings.setAppCacheEnabled(true); 
    settings.setSaveFormData(true);; 
    settings.setLoadWithOverviewMode(true); 
    settings.setSaveFormData(true); 
+0

Bạn có đang chơi với cookie của bên thứ ba không? – Rayon

Trả lời

5

Tiếp cận localStorage chỉ được phép trên các trang từ một số đề án "Web-safe", như http:, https:file:. Nó không hoạt động cho các sơ đồ about:data: ví dụ hoặc cho bất kỳ lược đồ tùy chỉnh nào mà bạn có thể đang sử dụng. Chrome hoạt động theo cùng một cách, bạn có thể kiểm tra trên máy tính để bàn.

+0

Hmm ... vì vậy nếu tôi chỉ tải nội dung HTML của riêng mình thay vì phân phát nội dung đó từ máy chủ, nó sẽ không hoạt động? – bugfixr

+0

Thử sử dụng 'WebView.loadDataWithBaseUrl' và chỉ định URL cơ sở bắt đầu bằng lược đồ' http: '. Hoặc bạn có thể chạy một máy chủ web đơn giản bên trong ứng dụng của mình. –

1

Bạn có yêu cầu quyền truy cập lưu trữ và mạng trong manifest.xml của bạn?

Something như thế này:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Có, có những người. – bugfixr

+0

Vâng ... Tôi tìm thấy những người gặp vấn đề này với google-chrome, nhưng không thể tìm thấy nó chỉ cho một ViewPager, nhưng những người hiểu biết, có lẽ điều này có thể giúp: http://stackoverflow.com/questions/24456891/iframe -in-chrome-error-uncaught-securityerror-fail-to-read-the-sessionstora – Damien

0

Để thao tác đối tượng chung trong JS, chúng tôi cần một thủ thuật. Như @Mikhail Naganov cho biết chromium phàn nàn về bảo mật Access denied using local storage in Android WebView

Tôi tải js làm url cơ sở và trong js cũng chuyển hướng đến url thực. Mã dưới đây hoạt động cho tôi trong android 7

String mimeType = "text/html"; 
    String encoding = "utf-8"; 
    String injection = "<script type='text/javascript'>localStorage.setItem('key', 'val');window.location.replace('REAL_URL_HERE');</script>"; 
    webview.loadDataWithBaseURL("REAL_URL_HERE", injection, mimeType, encoding, null); 
Các vấn đề liên quan