为什么我不能在android studio上的字符串变量中访问localStorage?

时间:2017-08-09 05:23:16

标签: javascript java android android-webview local-storage

我有一个非常基本的webview应用程序代码:

package com.budget.noname.budget;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String data = "<p id='v'></p><script>x=3; y=5; m=0; document.getElementById('v').innerHTML = m;</script>";
        WebView simpleWebView=(WebView) findViewById(R.id.simpleWebView);
        WebSettings webSettings = simpleWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setDomStorageEnabled(true);
        //simpleWebView.loadUrl("file:///android_asset/index.htm");
        simpleWebView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", "");

    }
}

如果我将我的webapp(index.htm)放在assets文件夹中并加载它,它可以很好地工作,但我的代码可供任何关心提取.apk的人使用。

我试图将代码粘贴到String上并使用loadDataWithBaseURL加载它。它几乎也有效。问题是:如果我尝试访问localStorage,代码就会中断。那是为什么?

示例:

String data = "<script>x=localStorage.getItem('name');</script>";

不起作用!!!虽然,正如我所说,如果我从资源文件夹加载相同的代码,它的工作原理。

1 个答案:

答案 0 :(得分:2)

就像已经stated here before

  

只允许在某些网页上访问localStorage   "Web-safe"计划,例如http:https:file:。它不起作用   例如about:data:方案,或任何自定义方案   可能正在使用。

如果您查看the loadDataWithBaseURL()'s docs,我们可以看到baseUrl param的以下声明:

  

字符串:用作网页基本网址的网址。如果null默认为   &#39; about:blank&#39;

这解释了为什么只有您的file:///示例有效,并且还意味着您必须将有效内容传递给此参数。您可以加载所需的任何URL,例如:

webView.loadDataWithBaseURL("http://google.com", data, "text/html", "UTF-8", "");

甚至http://localhost:80也会让它发挥作用。

但是,这不会使localStorage值可用于WebView的其他实例(默认情况下,它们不会在Android上进行对话)。一个常见的选择是使用另一个为您抽象的库,例如AndroidLocalStorage,例如