Android webview - 在某些jsp页面

时间:2015-06-05 05:05:12

标签: android jsp webview webviewclient

我一直在为许多拥有移动网站的公司开发混合应用程序。 事实上,有些网站是使用jsp制作的。

我已经知道iframe和javascripts xhr请求不会触发webViewClient的shouldOverrideUrlLoading覆盖函数。我很好。

但今天我学会了一些行动,如:

  • JSP页面重定向
  • 链接JSP页面中的点击次数
  • JSP / JS引发的URL加载

不会总是触发此功能。

因此,当要求webView加载无法加载的页面(即“intent:// ...”)时,shouldOverrideUrlLoading()不会触发,它会显示错误页面。

有没有人遇到过这种行为,有没有解决办法?

下面是我用来调用活动的代码,其中带有'intent:'协议的URL(由于执行上述操作时此函数永远不会被调用,因此会失败)

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // ... omitted ...
        if ( url.startsWith("intent:") ) {
            Intent intent = null;
            try {
                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                // The following flags launch the app outside the current app
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                try {
                    getActivity().startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            return true;
        }
}

PS。请注意,每个其他网站的页面加载将完美地调用shouldOverrideUrlLoading()。 我在android webViews上找不到任何JSP相关的错误,所以我问一个。

PS。我很乐意提供一些优秀的读者会尝试的样本网站..但网站上用韩文写的,所以我怀疑它会有所帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题可能与JSP不相关,真正的问题可能是shouldOverrideUrlLoading()本身。在这种情况下,使用shouldOverrideUrlLoading()可能不是一个好主意,那么为什么不尝试其他观点呢?

  • 使用时遇到很多问题 shouldOverrideUrlLoading()正在加载XmlHttpRequest。最后,我 使用onProgressChanged()提出了这个想法,并解决了所有问题 我的问题。我已经写了一个类似的答案here

我尝试将您的代码添加到我自己的webview项目中,并在一些JSP网站上对其进行了测试,看起来它始终可以正常工作。在调用其他活动之后,我还添加了loadUrl(),因此在按返回按钮后,将不再显示加载错误页面。所以试试这个:

首先声明一个全局变量以存储最后一个URL。

String strLastUrl = null;

然后重写onProgressChanged(WebView视图,int进度)

    mWebView.setWebChromeClient(new MyWebChromeClient(){
    
       @Override
       public void onProgressChanged(WebView view, int progress) {
                if (progress == 100) {
                    //A fully loaded url will come here
                    String StrNewUrl = view.getUrl();
                    if(TextUtils.equals(StrNewUrl,strLastUrl)){
                       //same page was reloaded, not doing anything
                    }else{
                       String strOldUrl = null;
                       //save old url to variable strOldUrl before overwriting it
                       strOldURL = strLastUrl;
                       //a new page was loaded,overwrite this new url to variable
                       strLastUrl = StrNewUrl;

                       if ( strLastUrl.startsWith("intent:") ) {
                           Log.d("TAG", "intent triggered");
                           Intent intent = null;
                           try {
                                intent = Intent.parseUri(strLastUrl, Intent.URI_INTENT_SCHEME);
                                // The following flags launch the app outside the current app
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                                try {
                                    startActivity(intent);
                                } catch (ActivityNotFoundException e) {
                                    e.printStackTrace();
                                }
                                //reload the page before invoking other activities
                                view.loadUrl(strOldURL);

                            } catch (URISyntaxException e) {
                                e.printStackTrace();
                            }

                        }

                    }
                }
                super.onProgressChanged(view, progress);
            }
    });