В моем приложении для Android у меня есть экран с WebView.
Логика этого экрана: пользователь нажимает кнопку поиска.Веб-просмотр открывался с помощью URL "https://xn - 90adear.xn - p1ai / check / auto ".JS-скрипт ищет переменную appVehicleCheck.reCaptchaToken, а затем приложение отправляет другой запрос в мой API.
Это прекрасно работает на любом Android, кроме Android 4.4 (API 19).Я получил эту ошибку: I / chromium: [INFO: CONSOLE (1)] "Uncaught TypeError: Невозможно прочитать свойство 'длина' из неопределенного", источник: https://xn - 90adear.xn - p1ai / assets /js / ext.js? 201808012357 (1)
Мой код:
private void reloadWebView() {
dismissProgressDialog();
progressView.setVisibility(View.VISIBLE);
captchaWebView.loadUrl(URL_GET_GIBDD);
captchaWebView.getSettings().setJavaScriptEnabled(true);
captchaWebView.getSettings().setDomStorageEnabled(true);
captchaWebView.getSettings().setLoadsImagesAutomatically(false);
captchaWebView.addJavascriptInterface(new JavaScriptInterface(captchaWebView), "AutoinsInterface");
captchaWebView.setWebViewClient(new AutoinsWebViewClient());
}
public class AutoinsWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
public void onReceivedError(android.webkit.WebView view, WebResourceRequest request, WebResourceError error) {
view.stopLoading();
captchaWebView.setVisibility(View.GONE);
final RelativeLayout samplesMain = (RelativeLayout) findViewById(R.id.root_layout);
mSnackbar = Snackbar.make(samplesMain, FullReportActivity.this.getResources().getString(R.string.insurance_error), Snackbar.LENGTH_INDEFINITE)
.setAction("Action", null)
.setDuration(2000);
mSnackbar.show();
progressView.setVisibility(View.GONE);
}
public void onReceivedSslError(android.webkit.WebView view, SslErrorHandler handler, SslError er) {
SslErrorHandler sslErrorHandler = handler;
if (er.getUrl().equals(URL_GET_GIBDD)) {
sslErrorHandler.proceed();
} else {
sslErrorHandler.cancel();
}
progressView.setVisibility(View.GONE);
}
public void onPageFinished(android.webkit.WebView view, String url) {
super.onPageFinished(view, url);
if (url.equals(URL_GET_GIBDD)) {
if (url.equals(URL_GET_GIBDD)) {
view.loadUrl("javascript:$('.ln-header').hide()");
view.loadUrl("javascript:$('.ln-footer').hide()");
view.loadUrl("javascript:$('.bn-federal-site').hide()");
view.loadUrl("javascript:$('.bn-top-menu').hide()");
view.loadUrl("javascript:$('.ln-content-right').hide()");
view.loadUrl("javascript:$('.widget-mistake').hide()");
view.loadUrl("javascript:$('.b-mobile-section').hide()");
view.loadUrl("javascript:$('h1,h2').hide()");
view.loadUrl("javascript:$('.ln-page').hide()");
view.loadUrl("javascript:getCookie = function(name) {\n" +
" var r = document.cookie.match(\"\\\\b\" + name + \"=([^;]*)\\\\b\");\n" +
" return r ? r[1] : null;\n" +
" };\n" +
"\n" +
" var session = getCookie('session');" );
view.loadUrl("javascript:var int; int = setInterval(function(){if(appVehicleCheck.reCaptchaToken.length > 0){ window.AutoinsInterface.make(appVehicleCheck.reCaptchaToken, session); clearInterval(int); } },1000);");
}
}
}
}
public class JavaScriptInterface {
private WebView webView;
public JavaScriptInterface(WebView webView) {
this.webView = webView;
}
@JavascriptInterface
public void make(String captcha_answer, String sessionId) throws Exception {
if (captcha_answer != null && captcha_answer.length() > 0) {
/* url, captcha, checktype, vin*/
ArrayList<String> passing = new ArrayList<String>();
passing.add(vinNumber);
passing.add(sessionId);
passing.add(captcha_answer);
progressView.setVisibility(View.VISIBLE);
sendGibddRequest = new SendGibddRequest();
try {
sendGibddRequest.execute(passing);
} catch (Exception e) {
e.printStackTrace();
}
} else {
captchaWebView.setVisibility(View.GONE);
progressView.setVisibility(View.GONE);
}
}
}
Не понимаю, почему эта проблема только на Android 4.4?
Я уже пытался использовать view.evaluateJavascript () вместо view.loadUrl ().И это не помогло.
Также у меня проблема с слишком большим количеством вызовов onPageFinished на некоторых устройствах.Я не воспроизводил эту проблему сам, но я вижу это в Аналитике.Может быть, кто-то может помочь мне с этим.