Webview无法在Android 5上加载页面

时间:2018-06-23 00:11:50

标签: javascript android webview

我正在开发一个应用程序,为了进行一些付款,我需要将用户从我的应用程序重定向到采用表单的Web视图,然后提交该表单,然后在WebView中提示输入密码,然后密码被提交后,我拦截了响应,然后使用响应进行付款。

我已经在配备Android 6及更高版本的设备上进行了此操作,但是在android 5上却遇到了问题。

这是我的代码的一部分。

private static String baseHTML = "<!DOCTYPE html>" +
        "<html>" +
        "<body onload=\"document.form1.submit()\">"+
        "<form name=\"form1\" method=\"post\" action=\"%0\">" +
        "   <input type=\"hidden\" name=\"PaReq\" value=\"%1\" ><br>" +
        "   <input type=\"hidden\" name=\"TermUrl\" value=\"%2\" ><br>" +
        "   <input type=\"hidden\" name=\"MD\" value=\"%3\"><br>" +
        "   <input type=\"hidden\" value=\"Authenticate\">" +
        "</form>" +
        "</body>" +
        "</html>";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_card3_dsecure);
    authWebView = findViewById(R.id.authWebView);
    authWebView.getSettings().setJavaScriptEnabled(true);
authWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

    authWebView.setWebChromeClient(new WebChromeClient() {
        public boolean onConsoleMessage(ConsoleMessage cmsg)
        {
            // check secret prefix
            if (cmsg.message().startsWith("3DSecure"))
            {
                String msg = cmsg.message().substring(5); // strip off prefix
                String jsonResponse = getJsonFromHTMLString(msg);
                if (jsonResponse != null) {
                    Intent intent = getIntent();
                    intent.putExtra("responseJson", jsonResponse);
                    setResult(RESULT_OK, intent);
                    finish();
                } else {
                    setResult(RESULT_CANCELED);
                    finish();
                }
                return true;
            } else {
                String msg = cmsg.message();
                Log.d("msg", cmsg.message());
            }


            return false;
        }
    });
    authWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished (final WebView view, String url) {

            if (url.equals(termURL)) {
                view.loadUrl("javascript:console.log('3DSecure'+document.documentElement.outerHTML.toString());");
            }
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.e("WebView", "Error: " + description);
        }


    });

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    String jsonString = extras.getString("jsonString");
    try {
        JSONObject jsonObject = new JSONObject(jsonString);
        acsURL = jsonObject.getString("acsURL");
        termURL = jsonObject.getString("termURL");
        paReq = jsonObject.getString("paReq");
        md = jsonObject.getString("md");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String bHtml = baseHTML
    htmlString = bHtml.replace("%0", acsURL).replace("%1", paReq)
            .replace("%2", termURL).replace("%3", md);
}

public void onStart() {
    super.onStart();
    authWebView.loadData(htmlString, "text/html", "UTF-8");
}

String getJsonFromHTMLString(String html) {
    if (html != null && html.length() != 0) {
        int startIndex = html.indexOf("{");
        int endIndex = html.lastIndexOf("}");
        if (startIndex >= 0) {
            String json = html.substring(startIndex, endIndex + 1);
            return json;
        }
    }
    return null;
}

public class AndroidInterface {
    Context mContext;

    /** Instantiate the interface and set the context */

    AndroidInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface   // must be added for API 17 or higher
    public void processHTML(String html) {
        Log.w("", html);
        String jsonResponse = getJsonFromHTMLString(html);
        if (jsonResponse != null) {
            Intent intent = getIntent();
            intent.putExtra("responseJson", jsonResponse);
            setResult(RESULT_OK, intent);
            finish();
        } else {
            setResult(RESULT_CANCELED);
            finish();
        }
    }
}

如代码中所示,我注入到Web视图中的HTML包含隐藏的字段和在执行form1时加载的正文中名为document.form1.submit()的表单。

这在Android 6及更高版本中可以使用,但是在android 5上却无法使用,它会提交表单,但不会显示用户输入密码的页面。

知道为什么会这样吗?

0 个答案:

没有答案