【问题标题】:how to inject javascript localstorage.setItem to webview in android?如何在android中将javascript localstorage.setItem注入webview?
【发布时间】:2020-12-07 05:56:19
【问题描述】:

我已经在 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;
 }


}

如果此代码可以正常工作,那么在 url 中加载用户数据,但由于当前加载 url 时会打开登录屏幕,因此有些方法无法正常工作。因此,如果任何解决方案在 webview 中有效,则不会加载登录屏幕。

还有一点是web端没有任何问题,因为它在IOS中工作,这里是ios实现

正如在图像 ios 开发人员中实现的那样。在 ios 中它的工作,我想在 webview 中做同样的事情。

如有任何帮助,我们将不胜感激。提前致谢。

【问题讨论】:

    标签: javascript android webview


    【解决方案1】:
     _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');");
                    }
                }
            });
    

    【讨论】:

    • 这也不起作用,它仍然打开登录页面而不是实际页面。
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多