javascript - 将 javascript 注入(inject) Android webview 不显示

标签 javascript android webview

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

https://api.sandbox.veritrans.co.id/v2/token/redirect/521111-1117-bad66da4-cc24-4c59-9ef6-05641fc82c60

我在 webview 中打开 url。我的 webview fragment 如下所示:

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实际上是在这里找到的:

http://api-docs.midtrans.com/#get-token

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

更新:连下面的都注入(inject)失败:

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);

更多引用JavaScript not working in Android Webview?

关于javascript - 将 javascript 注入(inject) Android webview 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841240/

相关文章:

android - 前台服务 onTaskRemoved 发送广播 Intent 失败 android.os.DeadObjectException

java - 将新项目添加到字符串数组

Android Gradle list 合并失败

android - View 引用成员变量和局部变量的区别

ios - swift : How to open specific link in safari instead UIWebView

JavaScript:将字符串与所有必需的字符匹配

javascript - 使用 JavaScript 获取 div 中的元素

javascript - 是否有名为 bind 的 JavaScript 或 jQuery 事件?

javascript - Electron ,Javascript : How to select an array within an array returned by the database

javascript - 拒绝显示框架,因为它在 android webview 中将 X-Frame-Options 设置为 'DENY