Android Webview - при перенаправлении выдает объект, перемещенный в - PullRequest
2 голосов
/ 21 января 2012

Я включил WebView в свое приложение для Android, которое подключается к службе проверки кредитных карт. Форма загружается правильно, и я получаю ошибки, как и ожидалось, если я введу неправильные значения. Однако для получения правильных значений служба перенаправляет на другую страницу, на которой должно отображаться сообщение об успешной проверке. Вместо этого я получаю только сообщение «Объект перемещен сюда». Когда я нажимаю «здесь», оно просто пропадает. Я попытался перегрузить 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;
        }
});

Что я могу сделать, чтобы это исправить?

Я должен добавить, что URL имеют базовую аутентификацию. Я передаю эту информацию в URL 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 каждый раз, когда что-то щелкаю. В противном случае Log.e, который я вставил в код WebViewClient, даже не отображается.

Обновление: Я проделал ту же самую деятельность в браузере Android (на вкладке Galaxy). Никаких проблем, но я отмечаю различия здесь для справки. Я получаю приглашение с именем пользователя и паролем, потому что я использую прямую ссылку, но я также получаю исключение сертификата, которое я принимаю, потому что это БЕТА для тестирования. Кроме того, браузер Android работает как с http://, так и с https://, но WebView даже не показывает первую страницу, если я использую https:// с URL.

Ответы [ 3 ]

0 голосов
/ 21 января 2012

public boolean shouldOverrideUrlLoading (представление WebView, URL-адрес строки) Поскольку: уровень API 1

Дайте хост-приложению возможность взять на себя управление, когда новый URL-адрес будет загружен в текущем WebView. Если WebViewClient не предоставлен, по умолчанию WebView попросит Activity Manager выбрать правильный обработчик для URL. Если предоставляется WebViewClient, возвращаемое значение true означает, что хост-приложение обрабатывает URL-адрес, а возвращаемое значение false означает, что текущий WebView обрабатывает URL-адрес.

Это всегда смущает меня, но объяснять ...

Когда загружается новый URL, вызывается этот метод. Если вы вернете true, то хост-приложение будет обрабатывать URL. Другими словами, возвращение true сообщает хост-приложению, что оно ДОЛЖНО отменять загрузку URL-адреса - это может вызвать перенаправление или стандартный браузер. Насколько я могу судить, это не то, что вы хотите.

Вы должны вернуть false, чтобы показать хост-приложению, что ваше WebView обработало его и что хост-приложение НЕ ДОЛЖНО отменять загрузку URL.

0 голосов
/ 22 января 2012

Решил это.Это была Аутентификация в конце концов.Перепробовав все методы аутентификации для 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/780694 и http://r3gis.fr/blog/index.php?post/2009/11/17/Android-WebView-and-ssl-self-signed-certificates

0 голосов
/ 21 января 2012

метод parse () класса Uri для преобразования строки URL в объект Uri.

 public void onReceivedSslError(WebView view,
    SslErrorHandler handler, SslError error) {
 Log.e("Error", "Received SSL error"+ error.toString());
 handler.proceed();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...