Входной поток для URL-адреса webview пуст, хотя webview отображает некоторый контент в своем представлении

#android #android-webview

#Android #android-webview

Вопрос:

Мне нужно прочитать содержимое html вместо того, чтобы показывать его в webview при выполнении последовательности транзакций с использованием webview, например, онлайн-платежей с использованием webview. Как только он дойдет до последней страницы, я проверю URL-адрес в обратном вызове onPageFinished и создам URLConnection для чтения входного потока. Но это всегда пустое содержимое, хотя в конечном webview есть некоторый контент на экране.

 public class mWebClient extends WebViewClient {
    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);

        // Utils.displayLogs("<<<<<< mydebug >>>>>>>", "onLoadResource : "
        //   url);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub

        super.onPageStarted(view, url, favicon);
        Utils.displayLogs("<<<<<< mydebug >>>>>>>", "Url : "   url);
        if (mProgressDialog != null amp;amp; !mProgressDialog.isShowing())
            mProgressDialog.show();
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub

        // Utils.displayLogs("<<<<<< mydebug >>>>>>>", "Url : "   url);
        if (url.endsWith("finalSuccessPage.aspx")
                || url.endsWith("finalErrorPage.aspx")) {
            try {
                List<String> vals = checkSuccessContent(url);
                if (vals != null amp;amp; vals.size() > 0) {                      
                    Log.d("<<<<<<mydebug >>>>>>", "vals[0] : "
                              vals.get(0));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        super.onPageFinished(view, url);
        if (mProgressDialog != null amp;amp; mProgressDialog.isShowing())
            mProgressDialog.dismiss();
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    private List<String> checkSuccessContent(String url) throws IOException {
        List<String> vals = new ArrayList<String>();
        if (url.endsWith("finalSuccessPage.aspx")
                || url.endsWith("finalErrorPage.aspx")) {


            URL tUrl = new URL(url);
            URLConnection con = tUrl.openConnection();

            Reader r = new InputStreamReader(con.getInputStream());
            StringBuilder buf = new StringBuilder();
            while (true) {
                int ch = r.read();
                if (ch < 0)
                    break;
                buf.append((char) ch);
            }
            String str = buf.toString();
            if (str.contains(Constants.STR_SUCCESS)) {
                String[] lVals = str.split("~");
                if (lVals != null) {
                    for (int i = 0; i < lVals.length; i  ) {
                        vals.add(lVals[i]);
                    }
                }
            }
        }

        return vals;
    }
}
 

Заранее спасибо,
JRH

Комментарии:

1. Не вызывайте loadUrl из shouldOverrideUrlLoading . shouldOverrideUrlLoading вызывается для подкадров со схемами, отличными от https. Если вы перейдете на страницу, например jsbin.com/gupug/1/quiet ваш код в конечном итоге вызовет view.loadUrl(‘tel: 1234’), и в конечном итоге вы увидите страницу с ошибкой, поскольку webview не знает, как загрузить tel: URL.

2. ожидает ли сервер, что некоторые файлы cookie будут на месте? См. eshyu.wordpress.com/2010/06/27 /…