将javascript注入Android webview时未显示

将javascript注入Android webview时未显示,javascript,android,webview,Javascript,Android,Webview,我有一个从第三方获得的url。我需要加载这个url,在用户输入密码后,它应该向android客户端发送一个令牌。url如下所示: https://api.sandbox.veritrans.co.id/v2/token/redirect/521111-1117-bad66da4-cc24-4c59-9ef6-05641fc82c60 我正在webview中打开url。我的webview片段如下所示: public class WebView3DSFragment extends Fragmen

我有一个从第三方获得的url。我需要加载这个url,在用户输入密码后,它应该向android客户端发送一个令牌。url如下所示:

https://api.sandbox.veritrans.co.id/v2/token/redirect/521111-1117-bad66da4-cc24-4c59-9ef6-05641fc82c60
我正在
webview
中打开url。我的
webview片段
如下所示:

public class WebView3DSFragment extends Fragment {

    @BindView(R.id.webview_3ds)
    WebView webView;


    public static WebView3DSFragment newInstance(Bundle b) {
        WebView3DSFragment fragment = new WebView3DSFragment();
        fragment.setArguments(b);
        return fragment;
    }

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_3ds_webview, container, false);
        ButterKnife.bind(this, rootView);

        String url = getArguments().getString("url", "");
        if (url != null) {
            webView.getSettings().setJavaScriptEnabled(true);
            injectJavaScript();
            webView.loadUrl(url);



        }
        return rootView;
    }

    public void injectJavaScript(){
        webView.addJavascriptInterface(new JS3DSInterface(), "Android");
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                webView.loadUrl(
                        "javascript:(function callback(response) {\n" +
                                "    if (response.redirect_url) {\n" +
                                "      // If 3Dsecure transaction. Open 3Dsecure dialog\n" +
                                "      console.log('Open Dialog 3Dsecure');\n" +
                                "      openDialog(response.redirect_url);\n" +
                                "\n" +
                                "    } else if (response.status_code == '200') {\n" +
                                "      // success 3d secure or success normal\n" +
                                "      //close 3d secure dialog if any\n" +
                                "      closeDialog();\n" +
                                "\n" +
                                "      // store token data in input #token_id\n" +
                                "      $(\"#token-id\").val(response.token_id);\n" +
                                "     " +"Android.set3DSToken(response.status_message)"+

                                "\n" +
                                "    } else {\n" +
                                "      // failed request token\n" +
                                "      //close 3d secure dialog if any\n" +
                                "      closeDialog();\n" +
                                "      $('#submit-button').removeAttr('disabled');\n" +
                                "      // Show status message.\n" +
                                "      $('#message').text(response.status_message);\n" +
                                "console.log(JSON.stringify(response));\n" +
                                "    }\n" +
                                "  }\n" +
                                "\n" +
                                "  // Open 3DSecure dialog box\n" +
                                "  function openDialog(url) {\n" +
                                "    // make sure to load fancybox in a script tag\n" +
                                "    $.fancybox.open({\n" +
                                "          href: url,\n" +
                                "          type: 'iframe',\n" +
                                "          autoSize: false,\n" +
                                "          width: 400,\n" +
                                "          height: 420,\n" +
                                "          closeBtn: false,\n" +
                                "          modal: true\n" +
                                "      });\n" +
                                "  }\n" +
                                "\n" +
                                "  // Close 3DSecure dialog box\n" +
                                "  function closeDialog() {\n" +
                                "    $.fancybox.close();\n" +
                                "  }\n" +
                                "});");
            }
        });

    }

    class JS3DSInterface {

        @JavascriptInterface
        public String set3DSToken(String s) {
            return "Java method called!!"+s;
        }
    }
}
代码中的
javascript
实际上可以在这里找到:

我觉得如果我能够将这个
javascript
注入
webview
中,那么当用户输入信息时,我就可以得到回调。但是当我运行webview时,url会加载,但当我签入stetho时chrome://inspect
webview
不包含我输入的
javascript
。如何注入
javascript

更新:即使以下内容也无法注入:

webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        view.loadUrl("javascript:alert('called by Android')");
    }
} 

因为我从来没有看到警报显示

在WebView中加载javascript

webView.getSettings().setDomStorageEnabled(true)

更多参考