Android WebView, wie man Weiterleitungen in der App behandelt, anstatt einen Browser zu öffnen

120

In meiner App wird die URL, auf die ich zugreife, derzeit umgeleitet. In diesem Fall öffnet WebView einen neuen Browser, anstatt in meiner App zu bleiben. Gibt es eine Möglichkeit, die Einstellungen so zu ändern, dass die Ansicht wie gewohnt zur URL umgeleitet wird, aber in meiner App bleibt, anstatt einen neuen Browser zu öffnen?

Bearbeiten:

Ich möchte die Umleitungs-URL, ich weiß nur nicht, wie ich sie erstellen soll. Der einzige Weg, um zu dieser URL zu gelangen, ist eine, die eine Umleitung zu der gewünschten URL bewirkt.

Beispiel: Wenn Sie hierher gehen: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 Beachten Sie, wie die URL zum tatsächlichen Produkt umgeleitet wird. Wenn ich es in meiner App in einem neuen Browser öffne, funktioniert dies einwandfrei. Wenn ich es jedoch mit einer WebView in meiner App behalte, wird es so angezeigt, als würde nach k = 9780735622777 gesucht: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . ODER es öffnet die Ansicht im Browser und zeigt an, was angemessen ist. Ich möchte jedoch alles in meiner App behalten.

James
quelle

Antworten:

253

Erstellen Sie einen WebViewClient und überschreiben Sie die Methode 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
quelle
8
Ich liebe Antworten, die wie method () sind {//
füge
19
Bitte replizieren Sie den obigen Code nicht. Geben Sie false vom Rückruf zurück, anstatt stattdessen view.loadUrl aufzurufen. Das Aufrufen von loadUrl führt zu einem subtilen Fehler, bei dem ein Iframe auf der Seite mit einer benutzerdefinierten Schema-URL (z. B. <iframe src = "tel: 123" />) im Hauptframe Ihrer App zu dieser URL navigiert, die die App höchstwahrscheinlich als beschädigt ein Nebeneffekt.
marcin.kosiba
@ marcin.kosiba hängt davon ab, wie es verwendet wird, für meinen Anwendungsfall ist das, was Sie beschreiben, kein Problem, aber ich schätze immer noch die Heads-Ups :)
Warpzit
@Warpzit - sicher, wenn Sie nur vertrauenswürdige Inhalte in die Webansicht laden und eine 100% ige Garantie haben, dass niemand diesen Fehler ausnutzen kann. OTOH warum das Risiko eingehen?
marcin.kosiba
1
Wie kann ich wissen, dass die URL, die in shouldOverrideUrlLoadingmethod aufgerufen wird, die nächste Weiterleitungs-URL ist? Und ich will es zulassen?
Phan Sinh
21

Nach Angaben des Beamten Dokumentation wird durch Klicken auf einen Link in WebView eine Anwendung gestartet, die URLs verarbeitet. Dies ist standardmäßig ein Browser. Sie müssen das Standardverhalten wie folgt überschreiben

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
abbas
quelle
8
Noch besser ist es, myWebView.setWebViewClient (neuer WebViewClient ()) aufzurufen. Die Standardimplementierung von shouldOverrideUrlLoading gibt false zurück.
Cyroxis
14

Das Hinzufügen eines Standardbenutzers reicht aus WebViewClient. Dadurch verarbeitet WebView alle geladenen URLs selbst.

mWebView.setWebViewClient(new WebViewClient());
Bis
quelle
8

Sie müssen festlegen, dass Ihr benutzerdefinierter WebviewClient die Methode shouldOverrideUrlLoading für Ihre Webansicht überschreibt, bevor Sie die URL laden.

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

Überprüfen Sie den Beispielcode für die Verarbeitung von Weiterleitungs-URLs und öffnen Sie PDF-Dateien ohne Download in der Webansicht. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

Ashish Das
quelle
Beachten Sie, dass der obige Link für einen Beispielcode nicht vorhanden ist.
Jetdog
Ich habe den Link hochgeladen.
Ashish Das
Arbeitete für mich Danke @AshishDas +10
Livemaker
2

Bitte verwenden Sie den folgenden Kotlin-Code

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

Für weitere Informationen klicken Sie hier

Shalu TD
quelle
2

Erstellen Sie eine Klasse, die den Webviewclient implementiert, und fügen Sie den folgenden Code hinzu, mit dem die URL-Zeichenfolge wie unten gezeigt überschrieben werden kann. Sie können diese [Beispiel] [1] sehen

public class myWebClient extends WebViewClient {

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

Erstellen Sie auf Ihrem Konstruktor ein Webview-Objekt wie unten gezeigt.

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

Fügen Sie dann den folgenden Code hinzu, um das Laden von URLs in Ihre App durchzuführen

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }
Daniel Nyamasyo
quelle
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
quelle
Hallo Willkommen, möchten Sie Ihren Code erklären und uns zeigen, warum dies die richtige Antwort ist?
Ali