如何在android中将javascript localstorage.setItem注入webview?

如何在android中将javascript localstorage.setItem注入webview?,javascript,android,webview,Javascript,Android,Webview,我已经在android中实现了webview,webview url也成功加载 现在我需要将javascript注入webview。我需要设置localstorage.setItem('key','value')。我发现了很多建议,但都不管用 下面是我如何设置webview和注入javascript的代码 webviewContactUs.getSettings().setJavaScriptEnabled(true); webviewContactUs.getSettings().se

我已经在android中实现了webview,webview url也成功加载

现在我需要将javascript注入webview。我需要设置localstorage.setItem('key','value')。我发现了很多建议,但都不管用

下面是我如何设置webview和注入javascript的代码

webviewContactUs.getSettings().setJavaScriptEnabled(true);
    webviewContactUs.getSettings().setDomStorageEnabled(true);
    webviewContactUs.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webviewContactUs.getSettings().setLoadWithOverviewMode(true);
    webviewContactUs.getSettings().setSupportMultipleWindows(true);
    webviewContactUs.getSettings().setAllowFileAccess(true);
    webviewContactUs.getSettings().setAllowUniversalAccessFromFileURLs(true);
    webviewContactUs.addJavascriptInterface(javascriptInterfaceTest, "javascriptInterfaceTest");

    webviewContactUs.setWebViewClient(new MyWebViewClient());

    webviewContactUs.loadUrl(url);

    private class MyWebViewClient extends WebViewClient {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        callFunction1(view);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        callFunction1(view);

    }

}

private  void callFunction1(WebView view) {
    //webviewContactUs.addJavascriptInterface(javascriptInterfaceTest, "javascriptInterfaceTest");
    webviewContactUs.evaluateJavascript(javascriptInterfaceTest.getData(), new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {
            System.out.println("==== callFunction1 onReceiveValue 1 : " + value);
        }
    });
}

public class JavascriptInterfaceTest {
private Context mContext;


public JavascriptInterfaceTest(Context context) {
    mContext = context;
    System.out.println("===== JavascriptInterfaceTest");
}

@JavascriptInterface
public String getData() {
    String key = "\'key_abc\'";
    String val = "\'{\"token\":\"3b46a55ae773c48ad27e43ac7a649737e6ed70477f7562b102054253e5706318\"}\'";


    /*String key = "key_abc";
    String val = "{token:3b46a55ae773c48ad27e43ac7a649737e6ed70477f7562b102054253e5706318}";*/

    //String returnData = "window.sessionStorage.setItem(" + key + "," + val + ");";
    //String returnData = "window.localStorage.setItem(" + key + "," + val + ")";
    String returnData = "localStorage.setItem(" + key + "," + val + ")";
    //String returnData = "sessionStorage.setItem(" + key + "," + val + ");";

   
    System.out.println("==== returnData : " + returnData);
    return returnData;
 }


}
webviewContactUs.getSettings().setJavaScriptEnabled(true);
webviewContactUs.getSettings().setDomStorageEnabled(true);
webviewContactUs.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webviewContactUs.getSettings().SetLoadWithOverview模式(true);
webviewContactUs.getSettings().setSupportMultipleWindows(true);
webviewContactUs.getSettings().setAllowFileAccess(true);
webviewContactUs.getSettings().setAllowUniversalAccessFromFileURLs(true);
addJavascriptInterface(javascriptInterfaceTest,“javascriptInterfaceTest”);
setWebViewClient(新的MyWebViewClient());
webviewContactUs.loadUrl(url);
私有类MyWebViewClient扩展了WebViewClient{
@凌驾
public void onPageStarted(WebView视图、字符串url、位图favicon){
super.onPageStarted(视图、url、favicon);
调用函数1(视图);
}
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
返回true;
}
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
调用函数1(视图);
}
}
私有void调用函数1(WebView视图){
//addJavascriptInterface(javascriptInterfaceTest,“javascriptInterfaceTest”);
webviewContactUs.evaluateJavascript(javascriptInterfaceTest.getData(),new ValueCallback()){
@凌驾
公共无效onReceiveValue(字符串值){
System.out.println(“==callFunction1 onReceiveValue 1:”+value);
}
});
}
公共类JavascriptInterfaceTest{
私有上下文;
公共JavascriptInterfaceTest(上下文){
mContext=上下文;
System.out.println(“====JavascriptInterfaceTest”);
}
@JavascriptInterface
公共字符串getData(){
字符串key=“\'key\u abc\”;
字符串val=“\'{\'token\”:\“3b46a55ae773c48ad27e43ac7a649737e6ed70477f7562b102054253e5706318\”;
/*String key=“key\u abc”;
字符串val=“{令牌:3b46a55ae773c48ad27e43ac7a649737e6ed70477f7562b102054253e5706318}”*/
//String returnData=“window.sessionStorage.setItem(“+key+”,“+val+”);”;
//String returnData=“window.localStorage.setItem(“+key+”,“+val+”);
字符串returnData=“localStorage.setItem(“+key+”,“+val+”);
//String returnData=“sessionStorage.setItem(“+key+”,“+val+”);”;
System.out.println(“==returnData:”+returnData);
返回数据;
}
}
如果这段代码可以工作,那么在url加载和用户数据,但这是如何工作,因为目前当url加载打开登录屏幕。所以,若任何解决方案在webview中起作用,则不会加载登录屏幕

还有一件事是,在web端并没有任何问题,因为在IOS中,它的工作方式是IOS实现

正如ios开发者实现的图像一样。在ios中,它可以工作,这和我想在webview中做的一样


任何帮助都将受到感谢。提前感谢。

这也不起作用,但它会打开登录页面而不是实际页面。
 _webView.setWebViewClient(new WebViewClient() {
            public void onPageFinished(WebView view, String url) {
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                    _webView.evaluateJavascript("localStorage.setItem('testkey','testvalue');", null);
                } else {
                    _webView.loadUrl("javascript:localStorage.setItem('testkey','testvalue');");
                }
            }
        });