Android WebView, jak obsługiwać przekierowania w aplikacji zamiast otwierać przeglądarkę

120

Tak więc teraz w mojej aplikacji adres URL, do którego uzyskuję dostęp, ma przekierowanie, a kiedy to się stanie, WebView otworzy nową przeglądarkę, zamiast pozostać w mojej aplikacji. Czy istnieje sposób, w jaki mogę zmienić ustawienia, aby widok przekierował do adresu URL jak zwykle, ale pozostanie w mojej aplikacji zamiast otwierania nowej przeglądarki?

Edytować:

Chcę adresu URL przekierowania, po prostu nie wiem, jak go utworzyć, więc jedynym sposobem na uzyskanie tego adresu URL jest użycie adresu, który spowoduje przekierowanie do tego, który chcę.

Na przykład: Kiedy wejdziesz tutaj: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 zwróć uwagę, jak przekieruje adres URL do rzeczywistego produktu. W mojej aplikacji, jeśli otworzę ją w nowej przeglądarce, zrobi to dobrze, jednak jeśli zatrzymam ją w mojej aplikacji z WebView, pojawi się tak, jakby szukała k = 9780735622777, na przykład: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . LUB, otworzy widok w przeglądarce i pokaże, co jest odpowiednie. Jednak chcę zachować wszystko w mojej aplikacji.

James
źródło

Odpowiedzi:

253

Utwórz WebViewClient i Zastąp metodę 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
   }
});
xandy
źródło
8
Uwielbiam odpowiedzi, które są podobne do method () {// po prostu umieść tutaj kod, którego nie wiesz, jak go użyć}
JMRboosties,
19
Nie kopiuj powyższego kodu. Zwróć false z wywołania zwrotnego zamiast wywoływania view.loadUrl. Wywołanie loadUrl wprowadza subtelny błąd polegający na tym, że jeśli masz na stronie jakikolwiek element iframe z adresem URL schematu niestandardowego (powiedzmy <iframe src = "tel: 123" />), spowoduje to nawigację w głównej ramce aplikacji do tego adresu URL, najprawdopodobniej uszkadzając aplikację jako efekt uboczny.
marcin.kosiba
@ marcin.kosiba zależy od tego, jak jest używany, w moim przypadku to, co opisujesz, nie jest problemem, ale nadal doceniam to, co się
dzieje
@Warpzit - jasne, jeśli ładujesz tylko zaufane treści do widoku internetowego i masz 100% gwarancję, że nikt nie może wykorzystać tej usterki, dobrze. OTOH po co ryzykować?
marcin.kosiba
1
Skąd mam wiedzieć, że adres URL, który wywołał shouldOverrideUrlLoadingmetodę, jest następnym przekierowaniem? I chcę na to pozwolić?
Phan Sinh
21

Zgodnie z oficjalną dokumentacją , kliknięcie dowolnego łącza w WebView uruchamia aplikację obsługującą adresy URL, która domyślnie jest przeglądarką. Musisz zmienić domyślne zachowanie w ten sposób

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
abbas
źródło
8
Jeszcze lepiej po prostu wywołaj myWebView.setWebViewClient (nowy WebViewClient ()); Domyślna implementacja shouldOverrideUrlLoading zwraca wartość false.
cyroxis
14

Wystarczy dodać domyślny niestandardowy WebViewClient. To sprawia, że ​​WebView sam obsługuje wszystkie załadowane adresy URL.

mWebView.setWebViewClient(new WebViewClient());
Do
źródło
8

Przed załadowaniem adresu URL będziesz musiał ustawić niestandardową metodę przesłaniającą metodę shouldOverrideUrlLoading WebviewClient dla swojego widoku internetowego.

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.
            }
        });

Sprawdź przykładowy kod do obsługi przekierowań i otwórz plik PDF bez pobierania w przeglądarce internetowej. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

Ashish Das
źródło
Zauważ, że powyższy link do przykładowego kodu nie istnieje.
Jetdog
przesłałem link.
Ashish Das
Pracował dla mnie Dziękuję @AshishDas +10
livemaker
2

Proszę użyć poniższego kodu kotlin

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

Aby uzyskać więcej informacji, kliknij tutaj

Shalu TD
źródło
2

Utwórz klasę, która implementuje webviewclient i dodaj następujący kod, który umożliwia zastąpienie ciągu adresu URL, jak pokazano poniżej. Możesz zobaczyć te [przykład] [1]

public class myWebClient extends WebViewClient {

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

W swoim konstruktorze utwórz obiekt Webview, jak pokazano poniżej.

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

Następnie dodaj następujący kod, aby wykonać ładowanie adresów URL w aplikacji

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }
Daniel Nyamasyo
źródło
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);
        
    }
}
Rasul Mammadov
źródło
Witaj, czy chciałbyś wyjaśnić swój kod i pokazać nam, dlaczego jest to właściwa odpowiedź?
Ali