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?
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 .
http://
ou https://
voltará verdadeiro
URLUtil.isValidUrl(url);
Se isso não funcionar, você pode usar:
Patterns.WEB_URL.matcher(url).matches();
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;
}
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.
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;
}
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;
}
No meu caso Patterns.WEB_URL.matcher(url).matches()
, não funciona corretamente quando digito algo String
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 pessoa
Você pode validar o URL seguindo:
Patterns.WEB_URL.matcher(potentialUrl).matches()
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 considerado URL
. Se for new URL()
bem-sucedido, basta verificar o padrão para excluir textos simples como " https: // gatos " a serem considerados URL
.