Android WebView,如何处理应用程序中的重定向而不是打开浏览器


120

因此,现在在我的应用程序中,我正在访问的URL具有重定向,当发生这种情况时,WebView将打开一个新的浏览器,而不是停留在我的应用程序中。有没有一种方法可以更改设置,以便视图可以像往常一样重定向到该URL,但是保留在我的应用程序中而不是打开新的浏览器?

编辑:

我想要重定向URL,我只是不知道如何创建它,因此,到达该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。或,它将在浏览器中打开视图并显示适当的内容。但是,我想将所有内容保留在我的应用程序中。

Answers:


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(){//只是把您不知道如何使用的代码放在这里的
答案

19
请不要复制上面的代码。从回调返回false,而不是调用view.loadUrl。调用loadUrl会引入一个细微的错误,即如果页面中有任何带有自定义方案URL的iframe(例如<iframe src =“ tel:123” />),它将把您应用的主框架导航到该URL,很可能会破坏该应用,副作用。
marcin.kosiba,2014年

@ marcin.kosiba取决于它的使用方式,对于我的用例,您所描述的不是问题,但我仍然非常注意:)
Warpzit

@Warpzit-当然,如果您仅将受信任的内容加载到Webview中,并且100%保证没有人可以利用该故障,那就好了。OTOH为什么会冒这个风险?
marcin.kosiba's

1
我怎么知道调用shouldOverrideUrlLoading方法的URL 是下一个重定向URL?我想允许它吗?
潘辛

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

在加载网址之前,您将必须为Webview设置自定义的WebviewClient覆盖shouldOverrideUrlLoading方法。

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

在Webview中检出用于处理重定向URL的示例代码,并打开PDF而无需下载。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


请注意,上面的示例代码链接不存在。
Jetdog

我已经上传了链接。
Ashish Das

为我工作感谢@AshishDas +10
livemaker

2

请使用以下Kotlin代码

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

在构造函数上,如下所示创建一个webview对象。

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

然后添加以下代码以在应用程序内部执行网址的加载

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

嗨,您好,您想解释一下您的代码并向我们展示为什么这是正确的答案吗?
阿里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.