2015-05-05 6 views
6

Mam przeglądarkę internetową na Androida, która, jak sądzę, ma wszystko, czego potrzeba, aby uzyskać dostęp do localStorage, ale widzę błąd "Odmowa dostępu" w konsoli przy próbie użycia Lokalny magazyn. Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.Odmowa dostępu przy użyciu pamięci lokalnej w Androidzie WebView

Czy ktoś może zauważyć jakiś problem?

kod JavaScript:

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

Oto kod 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

Czy grasz z plikami cookie innych firm? – Rayon

Odpowiedz

5

Dostęp do localStorage jest dozwolone tylko na stronach z niektórych programów "web-safe", jak http:, https: i file:. Nie działa na przykład w przypadku schematów about: i data: ani żadnego niestandardowego schematu, który może być używany. Chrome zachowuje się w ten sam sposób, możesz sprawdzić na komputerze.

+0

Hmm ... więc jeśli po prostu załaduję własną treść HTML zamiast serwować ją z serwera, to nie zadziała? – bugfixr

+0

Spróbuj użyć 'WebView.loadDataWithBaseUrl' i podaj bazowy adres URL zaczynając od schematu' http: '. Możesz też uruchomić prosty serwer WWW w swojej aplikacji. –

1

Czy poprosić o uprawnienia do dostępu do pamięci masowej i sieci w manifest.xml?

coś takiego:

<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

Tak, mam to. – bugfixr

+0

No cóż ... Uważam, że osoby mające ten problem z google-chrome, ale nie mogą go znaleźć tylko dla ViewPagera, ale kto wie, może to mogłoby pomóc: http://stackoverflow.com/questions/24456891/iframe -in-chrome-error-uncaught-securityerror-failed-to-read-the-sessionstora – Damien

0

Do manipulowania obiektem globalnym w JS potrzebna jest sztuczka. Jak @Mikhail Naganov powiedział, że chrom narzeka na bezpieczeństwo Access denied using local storage in Android WebView

Załaduję js jako podstawowy adres URL, aw js również przekierowuję do prawdziwego adresu URL. Poniższy kod zadziałał dla mnie w Androidzie 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);