2015-05-05 19 views
6

Ho una vista Web Android, che credo abbia tutto il necessario per accedere e utilizzare localStorage, tuttavia, sto vedendo un errore "Accesso negato" nella console quando si tenta di utilizzare memoria locale. Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.Accesso negato utilizzando la memoria locale in Android WebView

Qualcuno può individuare un problema?

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

Ecco il codice di 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

Stai giocando con i cookie di terze parti? – Rayon

risposta

5

accesso al localStorage è consentito solo sulle pagine di taluni regimi di "web-safe", come http:, https: e file:. Ad esempio, non funziona per gli schemi about: e data: o per qualsiasi schema personalizzato che potresti utilizzare. Chrome si comporta allo stesso modo, è possibile controllare sul desktop.

+0

Hmm ... quindi se caricherò il mio contenuto HTML invece di servirlo da un server, non funzionerà? – bugfixr

+0

Prova a utilizzare 'WebView.loadDataWithBaseUrl' e specifica un URL di base che inizia con lo schema' http: '. Oppure puoi eseguire un semplice web server all'interno della tua app. –

1

Hai chiesto autorizzazioni per l'accesso allo storage e di rete nel manifest.xml?

Qualcosa di simile a questo:

<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

Sì, ho capito. – bugfixr

+0

Beh ... trovo persone con questo problema con google-chrome, ma non riesco a trovarlo solo per un ViewPager, ma chissà, forse questo potrebbe aiutare: http://stackoverflow.com/questions/24456891/iframe -in-chrome-error-uncaught-securityerror-failed-to-read-the-sessionstora – Damien

0

Per manipolare l'oggetto globale in JS è necessario un trucco. Come @Mikhail Naganov ha detto che cromo si lamenta della sicurezza Access denied using local storage in Android WebView

Carico js come URL di base e in js reindirizza anche all'URL reale. Sotto codice ha funzionato per me in 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);