【问题标题】:Android WebView, how to handle redirects in app instead of opening a browserAndroid WebView,如何在应用程序中处理重定向而不是打开浏览器
【发布时间】:2010-11-01 03:13:05
【问题描述】:

所以现在在我的应用程序中,我正在访问的 URL 有一个重定向,当这种情况发生时,WebView 将打开一个新的浏览器,而不是留在我的应用程序中。有没有办法可以更改设置,以便视图将像往常一样重定向到 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 。或者,它将在浏览器中打开视图并显示合适的内容。但是,我想将所有内容都保留在我的应用中。

【问题讨论】:

    标签: android android-webview


    【解决方案1】:

    创建一个 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
       }
    });
    

    【讨论】:

    • 我喜欢类似method()的答案{ //把你不知道怎么用的代码放在这里}
    • 请不要复制上面的代码。从回调中返回 false 而不是调用 view.loadUrl。调用 loadUrl 会引入一个微妙的错误,如果页面中有任何带有自定义方案 URL(例如 )的 iframe,它会将应用程序的主框架导航到该 URL,这很可能会破坏应用程序副作用。
    • @marcin.kosiba 取决于它的使用方式,对于我的用例而言,您所描述的不是问题,但我仍然感谢您的提醒:)
    • @Warpzit - 当然,如果您只将受信任的内容加载到 web 视图中并且 100% 保证没有人可以利用该故障,那很好。 OTOH 为什么要冒险?
    • 我怎么知道调用shouldOverrideUrlLoading方法的url是下一个重定向url?我想允许吗?
    【解决方案2】:

    根据官方documentation,单击 WebView 中的任何链接都会启动一个处理 URL 的应用程序,默认情况下是一个浏览器。您需要像这样覆盖默认行为

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

    【讨论】:

    • 最好只调用 myWebView.setWebViewClient(new WebViewClient()); shouldOverrideUrlLoading 的默认实现返回 false。
    【解决方案3】:

    只需添加一个默认自定义WebViewClient 即可。这使得 WebView 自己处理任何加载的 url。

    mWebView.setWebViewClient(new WebViewClient());
    

    【讨论】:

      【解决方案4】:

      在加载 url 之前,您必须为您的 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.
                  }
              });
      

      在 web 视图中查看用于处理重定向 url 和打开 PDF 而不下载的示例代码。 https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500

      【讨论】:

      • 请注意,上面的示例代码链接不存在。
      • 我已经上传了链接。
      • 为我工作谢谢@AshishDas +10
      【解决方案5】:

      请使用下面的 kotlin 代码

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

      更多信息请点击here

      【讨论】:

        【解决方案6】:

        创建一个实现 webviewclient 的类并添加以下代码,以允许 ovveriding url 字符串,如下所示。 你可以看到这些[example][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)); 
        

        然后添加以下代码以在您的应用中执行 url 加载

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

        【讨论】:

          【解决方案7】:
          @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);
                  
              }
          }
          

          【讨论】:

          • 您好,欢迎您,您想解释一下您的代码并向我们展示为什么这是正确答案吗?
          猜你喜欢
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多