Existe uma boa maneira de evitar o erro "o host não foi resolvido" que bloqueia um aplicativo? Algum tipo de maneira de tentar se conectar a um host (como um URL) e ver se ele é válido?
android
url
url-validation
Kidalex
fonte
fonte
Respostas:
Use URLUtil para validar o URL conforme abaixo.
URLUtil.isValidUrl(url)
Ele retornará True se o URL for válido e falso se o URL for inválido .
fonte
http://
ouhttps://
voltará verdadeiroURLUtil.isValidUrl(url);
Se isso não funcionar, você pode usar:
Patterns.WEB_URL.matcher(url).matches();
fonte
Eu usaria uma combinação dos métodos mencionados aqui e em outros threads do 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; }
fonte
Envolva a operação em um try / catch. Há muitas maneiras de um URL ser bem formado, mas não recuperável. Além disso, testes como verificar se o nome do host existe não garantem nada porque o host pode se tornar inacessível logo após a verificação. Basicamente, nenhuma quantidade de pré-verificação pode garantir que a recuperação não falhará e lançará uma exceção, então é melhor planejar lidar com as exceções.
fonte
Tentei vários métodos. E descobri que ninguém funciona bem com este URL:
Agora uso o seguinte e dá tudo certo.
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; }
fonte
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; }
fonte
No meu caso
Patterns.WEB_URL.matcher(url).matches()
, não funciona corretamente quando digito algoString
semelhante a "first.secondword" (Meu aplicativo verifica a entrada do usuário). Este método retorna verdadeiro.URLUtil.isValidUrl(url)
funciona corretamente para mim. Talvez fosse útil para outra pessoafonte
Se estiver usando o from,
kotlin
você pode criar umString.kt
e escrever o código abaixo:fun String.isValidUrl(): Boolean = Patterns.WEB_URL.matcher(this).matches()
Então:
String url = "www.yourUrl.com" if (!url.isValidUrl()) { //some code }else{ //some code }
fonte
Você pode validar o URL seguindo:
Patterns.WEB_URL.matcher(potentialUrl).matches()
fonte
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; } }
Esta é a solução correta que estou usando. Adicionar
https://
antes do texto original evita que texto como "www.cats.com" seja consideradoURL
. Se fornew URL()
bem-sucedido, basta verificar o padrão para excluir textos simples como " https: // gatos " a serem consideradosURL
.fonte
Basta adicionar esta linha de código:
Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();
fonte
new java.net.URL(String) throws MalformedURLException
fonte