【问题标题】:How to check if URL is valid in Android如何检查 URL 在 Android 中是否有效
【发布时间】:2011-06-21 18:18:10
【问题描述】:

是否有避免导致应用程序崩溃的“主机未解析”错误的好方法?某种方式尝试连接到主机(如 URL)并查看它是否有效?

【问题讨论】:

  • 你是如何连接到主机的?

标签: android url url-validation


【解决方案1】:

我会结合使用此处和其他 Stackoverflow 线程中提到的方法:

public static boolean IsValidUrl(String urlString) {
    try {
        URL url = new URL(urlString);
        return URLUtil.isValidUrl(urlString) && Patterns.WEB_URL.matcher(urlString).matches();
    } catch (MalformedURLException ignored) {
    }
    return false;
}

【讨论】:

    【解决方案2】:

    只需添加这行代码:

    Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       
    

    【讨论】:

      【解决方案3】:
      URLUtil.isValidUrl(url);
      

      如果这不起作用,您可以使用:

      Patterns.WEB_URL.matcher(url).matches();
      

      【讨论】:

      • 这不只是检查模式而不是 URL 是否实际处于活动状态吗?
      • 据我所知,如果我们需要检查 url 是否真的在 ping,我们应该使用 HttpURLConnection 类手动检查。
      • 如果您需要检查没有架构的 url,请使用第二个选项。如果未添加架构,URLUtil.isValidUrl 将返回 false。
      【解决方案4】:
      public static boolean isURL(String text) {
          String tempString = text;
      
          if (!text.startsWith("http")) {
              tempString = "https://" + tempString;
          }
      
          try {
              new URL(tempString).toURI();
              return Patterns.WEB_URL.matcher(tempString).matches();
          } catch (MalformedURLException | URISyntaxException e) {
              e.printStackTrace();
              return false;
          }
      }
      

      这是我正在使用的正确解决方案。在原始文本之前添加https:// 可以防止将诸如“www.cats.com”之类的文本视为URL。如果new URL() 成功,那么如果您只是检查模式以排除像“https://cats”这样的简单文本被视为URL

      【讨论】:

        【解决方案5】:

        您可以通过以下方式验证 URL:

        Patterns.WEB_URL.matcher(potentialUrl).matches()
        

        【讨论】:

          【解决方案6】:
          new java.net.URL(String) throws MalformedURLException
          

          【讨论】:

            【解决方案7】:

            如果您使用的是 kotlin,您可以创建一个 String.kt 并编写以下代码:

            fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
            

            然后:

            String url = "www.yourUrl.com"
            if (!url.isValidUrl()) {
                //some code
            }else{
               //some code
            }
            

            【讨论】:

              【解决方案8】:

              在我输入类似于“first.secondword”的String(我的应用程序检查用户输入)的情况下,Patterns.WEB_URL.matcher(url).matches() 无法正常工作。此方法返回 true。

              URLUtil.isValidUrl(url) 对我来说可以正常工作。也许它对其他人有用

              【讨论】:

                【解决方案9】:
                import okhttp3.HttpUrl;
                import android.util.Patterns;
                import android.webkit.URLUtil;
                
                            if (!Patterns.WEB_URL.matcher(url).matches()) {
                                error.setText(R.string.wrong_server_address);
                                return;
                            }
                
                            if (HttpUrl.parse(url) == null) {
                                error.setText(R.string.wrong_server_address);
                                return;
                            }
                
                            if (!URLUtil.isValidUrl(url)) {
                                error.setText(R.string.wrong_server_address);
                                return;
                            }
                
                            if (!url.substring(0,7).contains("http://") & !url.substring(0,8).contains("https://")) {
                                error.setText(R.string.wrong_server_address);
                                return;
                            }
                

                【讨论】:

                  【解决方案10】:

                  我尝试了很多方法。发现没有人能很好地使用this URL:

                  现在我使用以下,一切顺利。

                  public static boolean checkURL(CharSequence input) {
                      if (TextUtils.isEmpty(input)) {
                          return false;
                      }
                      Pattern URL_PATTERN = Patterns.WEB_URL;
                      boolean isURL = URL_PATTERN.matcher(input).matches();
                      if (!isURL) {
                          String urlString = input + "";
                          if (URLUtil.isNetworkUrl(urlString)) {
                              try {
                                  new URL(urlString);
                                  isURL = true;
                              } catch (Exception e) {
                              }
                          }
                      }
                      return isURL;
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    使用 URLUtil 来验证 URL,如下所示。

                     URLUtil.isValidUrl(url)
                    

                    如果 URL 有效则返回 True如果 URL 无效则返回 false

                    【讨论】:

                    • isValidUrl 为以下 URL 返回 false,尽管设备似乎对此很满意(它缺少文件后的双斜杠:)。 “文件:/storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png”
                    • 我不会依赖这种方法,因为它不执行深度验证,只执行最简单的 WebView 案例。见source
                    • 好像只要有http://或者https://都会返回true
                    • 这是否有助于避免使用诸如 mailto: abc@xyz.com 和 about:blank#blocked 之类的网址
                    【解决方案12】:

                    将操作包装在 try/catch 中。有很多方法可以使 URL 格式正确但不可检索。此外,诸如查看主机名是否存在之类的测试并不能保证任何事情,因为主机可能会在检查后变得无法访问。基本上,再多的预检查也无法保证检索不会失败并抛出异常,因此您最好计划处理异常。

                    【讨论】:

                    • 我不介意处理异常,但是如何防止应用程序由于该异常而崩溃?
                    • @kidalex Err,catch 异常? else“处理异常”可能意味着什么?
                    猜你喜欢
                    • 2018-05-15
                    • 2015-08-06
                    • 2014-07-24
                    • 2010-12-20
                    • 1970-01-01
                    • 2021-10-12
                    • 1970-01-01
                    • 2010-10-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多