Android Webview - 重定向时将“对象移动到”

时间:2012-01-21 11:54:25

标签: android android-webview

我的Android应用中包含一个WebView,用于连接信用卡验证服务。 表单加载正确,如果我输入错误的值,我会得到预期的错误。但是,对于正确的值,服务会重定向到应显示成功验证消息的另一个页面。相反,我只会将一个"对象移到这里"信息。当我点击这里的'它只是空白。 我尝试重载WebViewClient如下所述,认为重定向可能无法正确处理,但似乎没有帮助。

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("http://username:password@address...");
mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.e("WebViewLog",url);
            view.loadUrl(url);

            return true;
        }
});

我该怎么做才能解决这个问题?

我应该补充说,网址具有基本身份验证功能。我在网址mWebView.loadUrl("http://username:password@address...")中传递了此信息。

LogCat如下:

01-21 23:02:12.167: D/dalvikvm(3974): GC_CONCURRENT freed 1240K, 58% free 3061K/7175K, external 3160K/3465K, paused 1ms+2ms
01-21 23:02:17.867: D/navcache(3974): cursorInputFieldAction : No node under current cursor
01-21 23:02:17.867: D/navcache(3974): cursorInputFieldAction cursor=50e014, cursorFrame=50d828
01-21 23:02:17.867: D/navcache(3974): CachedFrame::previousInputField this=50d828, start=50e014, begin=50dfb0 end=50e208
01-21 23:02:17.867: D/navcache(3974): CachedFrame::nextInputField this=50d828, start=50e014, begin=50dfb0 end=50e208
01-21 23:02:17.867: D/navcache(3974): cursorInputFieldAction next=50e140, prev=0, action=8
01-21 23:02:17.999: V/webview(3974): OnSizeChanged: Enter 
01-21 23:02:17.999: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:20.335: W/KeyCharacterMap(3974): No keyboard for id 0
01-21 23:02:20.335: W/KeyCharacterMap(3974): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-21 23:02:20.363: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:20.878: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:21.320: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:22.164: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:22.855: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:23.183: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:23.492: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....    
01-21 23:02:23.769: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:24.531: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:24.874: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:25.187: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:25.507: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:27.210: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:27.546: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:27.812: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:28.117: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:37.542: D/navcache(3974): cursorInputFieldAction cursor=4bd634, cursorFrame=4f3160
01-21 23:02:37.542: D/navcache(3974): CachedFrame::previousInputField this=4f3160, start=4bd634,     begin=4bd5d0 end=4bd828
01-21 23:02:37.542: D/navcache(3974): CachedFrame::nextInputField this=4f3160, start=4bd634,     begin=4bd5d0 end=4bd828
01-21 23:02:37.542: D/navcache(3974): cursorInputFieldAction next=4bd760, prev=0, action=8
01-21 23:02:37.632: E/webtextview(3974): ....Doing a super.requestRectangleOnScreen....
01-21 23:02:37.648: V/webview(3974): OnSizeChanged: Enter 
01-21 23:02:38.847: D/navcache(3974): cursorInputFieldAction cursor=507fd0, cursorFrame=4f3160
01-21 23:02:38.847: D/navcache(3974): CachedFrame::previousInputField this=4f3160, start=507fd0,     begin=507e40 end=508098
01-21 23:02:38.847: D/navcache(3974): CachedFrame::nextInputField this=4f3160, start=507fd0,     begin=507e40 end=508098
01-21 23:02:38.847: D/navcache(3974): cursorInputFieldAction next=508034, prev=507ea4, action=9
01-21 23:02:39.070: D/dalvikvm(3974): GC_CONCURRENT freed 1098K, 57% free 3087K/7175K, external     3171K/3465K, paused 2ms+2ms
01-21 23:02:39.109: V/webview(3974): OnSizeChanged: Enter 
01-21 23:02:39.164: V/webview(3974): Select Control Rect(101, 210 - 161, 241)
01-21 23:02:41.261: V/webview(3974): OnSizeChanged: Enter 
01-21 23:02:42.656: D/navcache(3974): cursorInputFieldAction cursor=507ff4, cursorFrame=4cb1d0
01-21 23:02:42.656: D/navcache(3974): CachedFrame::previousInputField this=4cb1d0, start=507ff4,     begin=507e00 end=508058
01-21 23:02:42.656: D/navcache(3974): CachedFrame::nextInputField this=4cb1d0, start=507ff4,     begin=507e00 end=508058
01-21 23:02:42.656: D/navcache(3974): cursorInputFieldAction next=0, prev=507f90, action=18
01-21 23:02:42.847: V/webview(3974): OnSizeChanged: Enter 
01-21 23:02:42.902: V/webview(3974): Select Control Rect(165, 210 - 242, 241)
01-21 23:02:45.308: V/webview(3974): OnSizeChanged: Enter 
01-21 23:03:12.296: D/dalvikvm(3974): GC_CONCURRENT freed 1166K, 57% free 3129K/7175K, external     3171K/3465K, paused 9ms+3ms
01-21 23:03:12.304: D/webviewglue(3974): nativeDestroy view: 0x449480

每次点击内容时都会收到Doing a super.requestRectangleOnScreen错误。否则,我在WebViewClient代码中放置的Log.e甚至无法显示。

更新:我在Android浏览器上进行了相同的活动(在Galaxy Tab上)。没有任何问题,但我注意到这里的差异以供参考。我得到一个用户名和密码提示,因为我使用直接链接,但我也得到了一个证书例外我接受,因为这是一个测试的BETA。此外,Android浏览器同时使用http://https://,但WebView甚至没有显示第一页是我使用https://和URL。

3 个答案:

答案 0 :(得分:0)

的 用于将URL字符串转换为Uri对象的Uri类的parse()方法。

 public void onReceivedSslError(WebView view,
    SslErrorHandler handler, SslError error) {
 Log.e("Error", "Received SSL error"+ error.toString());
 handler.proceed();
}

答案 1 :(得分:0)

  

public boolean shouldOverrideUrlLoading(WebView view,String url)从:API Level 1

     

当要在当前WebView中加载新URL时,让主机应用程序有机会接管控件。如果未提供WebViewClient,则默认情况下WebView将要求活动管理器为URL选择正确的处理程序。 如果提供了WebViewClient,则返回true表示主机应用程序处理URL,而return false表示当前WebView处理该URL。

这总是让我感到困惑,但要解释......

当要加载新网址时,会调用此方法。如果您返回true,则主机应用程序将处理该URL。换句话说,返回true告诉主机应用程序它应该覆盖url加载 - 这可能导致重定向或库存浏览器被调用。据我所知,这不是你想要的。

您应该返回false以显示您的WebView已处理它的主机应用程序以及主机应用程序不应该覆盖网址加载。

答案 2 :(得分:0)

解决了它。毕竟这是身份验证。在尝试了WebView的所有身份验证方法后,我切换到了SSL。

证书导致了一个问题,我可以使用WebViewClient中的以下方法覆盖来绕过该问题。

@Override
public void onReceivedSslError(WebView view,
                SslErrorHandler handler, SslError error) {
Log.e("Error", "Received SSL error"+ error.toString());
handler.proceed();
}

免责声明:我这样做是为了测试,因为这是测试版。对于严肃的事情,这可能不是一个好主意。但是,对于Android WebView如何使用SSL,似乎存在一些混淆。对于任何感兴趣的人,以下链接可能有用:https://stackoverflow.com/a/5978391/780694http://r3gis.fr/blog/index.php?post/2009/11/17/Android-WebView-and-ssl-self-signed-certificates