Android WebView, как обрабатывать перенаправления в приложении вместо открытия браузера


120

Итак, прямо сейчас в моем приложении URL-адрес, к которому я обращаюсь, имеет перенаправление, и когда это произойдет, WebView откроет новый браузер, а не останется в моем приложении. Есть ли способ изменить настройки, чтобы представление перенаправлялось на URL-адрес, как обычно, но оставалось в моем приложении вместо открытия нового браузера?

Редактировать:

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

Например: когда вы переходите сюда: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 обратите внимание, как он перенаправит URL-адрес на фактический продукт. В моем приложении, если я открою его в новом браузере, он справится с этим нормально, однако, если я сохраню его в своем приложении с помощью WebView, он будет отображаться так, как будто он выполняет поиск по k = 9780735622777, например: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . ИЛИ, он откроет представление в браузере и покажет, что подходит. Однако я хочу сохранить все в своем приложении.

Ответы:


253

Создайте WebViewClient и переопределите метод shouldOverrideUrlLoading .

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
Мне нравятся ответы, похожие на method () {// просто поместите сюда код, который вы не знаете, как использовать}
JMRboosties

19
Пожалуйста, не копируйте приведенный выше код. Верните false из обратного вызова вместо вызова view.loadUrl. Вызов loadUrl вызывает небольшую ошибку, при которой, если на странице есть какой-либо iframe с URL-адресом настраиваемой схемы (скажем, <iframe src = "tel: 123" />), он будет перемещать основной фрейм вашего приложения на этот URL-адрес, скорее всего, нарушит работу приложения как побочный эффект.
marcin.kosiba 07

@ marcin.kosiba зависит от того, как он используется, для моего случая использования то, что вы описываете, не является проблемой, но я все равно ценю внимание :)
Warpzit

@Warpzit - конечно, если вы загружаете только доверенный контент в веб-просмотр и имеете 100% гарантию, что никто не сможет использовать этот глюк, прекрасно. OTOH зачем рисковать?
marcin.kosiba

1
Как я могу узнать, что URL-адрес, который shouldOverrideUrlLoadingвызывается в методе, является следующим URL-адресом перенаправления? И я хочу это позволить?
Phan Sinh

21

Согласно официальной документации , щелчок по любой ссылке в WebView запускает приложение, которое обрабатывает URL-адреса, которое по умолчанию является браузером. Вам нужно переопределить поведение по умолчанию, подобное этому

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

8
Еще лучше просто вызвать myWebView.setWebViewClient (new WebViewClient ()); Реализация по умолчанию shouldOverrideUrlLoading возвращает false.
cyroxis

14

Достаточно просто добавить кастом по умолчанию WebViewClient. Это заставляет WebView обрабатывать любые загруженные URL-адреса самостоятельно.

mWebView.setWebViewClient(new WebViewClient());

8

Вам нужно будет установить свой собственный WebviewClient, переопределяющий метод shouldOverrideUrlLoading для вашего веб-просмотра перед загрузкой URL-адреса.

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

Ознакомьтесь с примером кода для обработки URL-адресов перенаправления и открытия PDF без загрузки в веб-просмотре. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Обратите внимание, что приведенная выше ссылка для примера кода не существует.
Jetdog

я загрузил ссылку.
Ашиш Дас

Работал на меня Спасибо @AshishDas +10
livemaker

2

Пожалуйста, используйте приведенный ниже код котлина

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

Для получения дополнительной информации нажмите здесь


2

Создайте класс, реализующий webviewclient, и добавьте следующий код, который позволяет контролировать строку URL-адреса, как показано ниже. Вы можете увидеть эти [пример] [1]

public class myWebClient extends WebViewClient {

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

В конструкторе создайте объект веб-просмотра, как показано ниже.

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Затем добавьте следующий код для загрузки URL-адресов внутри вашего приложения.

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

Привет, добро пожаловать! Не хотели бы вы объяснить свой код и показать нам, почему это правильный ответ?
Али
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.