Como verificar se o URL é válido no Android

96

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?

Kidalex
fonte
como você está se conectando ao host?
SteelBytes

Respostas:

197

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 .

dd619
fonte
isValidUrl retorna false para a seguinte URL, embora o dispositivo pareça feliz com isso (falta a barra dupla após o arquivo :). "file: /storage/emulated/0/Android/data/com.samsung.android.app.pinboard/files/ClipData/Screenshot_NormarAppImage.png"
Tom Hamshere
7
Eu não confiaria neste método, porque ele não executa validação profunda, apenas a maioria dos casos simples do WebView. Ver fonte
marwinXXII
14
Melhor resposta: stackoverflow.com/questions/5617749/…
marwinXXII
1
parece que enquanto tiver http://ou https://voltará verdadeiro
hehe
Isso ajudaria a evitar urls como mailto: [email protected] e sobre: ​​em branco # bloqueado
RamPrasadBismil
71
URLUtil.isValidUrl(url);

Se isso não funcionar, você pode usar:

Patterns.WEB_URL.matcher(url).matches();
Pranav
fonte
Isso não apenas verifica o padrão em vez de se o URL está realmente ativo?
Declan McKenna
1
Pelo que eu sei, se precisamos verificar se url está realmente pingando ou não, devemos verificar manualmente usando a classe HttpURLConnection.
Pranav de
Use a segunda opção se precisar verificar urls sem esquema. URLUtil.isValidUrl retornará falso se o esquema não for adicionado.
user3783123
19

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;
}
Ayaz Alifov
fonte
5

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.

ninguém
fonte
Não me importo em lidar com a exceção, mas como posso evitar que o aplicativo trave devido a essa exceção?
kidalex
4
@kidalex Err, pegou a exceção? O que mais poderia significar 'lidar com a exceção'?
user207421
4

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;
}
androidyue
fonte
4
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;
            }
Krzysztof Dziuba
fonte
4

No meu caso Patterns.WEB_URL.matcher(url).matches(), não funciona corretamente quando digito algo Stringsemelhante 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

Jackky777
fonte
4

Se estiver usando o from, kotlinvocê pode criar um String.kte 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
}
jo jo
fonte
3

Você pode validar o URL seguindo:

Patterns.WEB_URL.matcher(potentialUrl).matches()
Muhammad Naeem Paracha
fonte
2
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.

Chirila Vasile
fonte
2

Basta adicionar esta linha de código:

Boolean isValid = URLUtil.isValidUrl(url) && Patterns.WEB_URL.matcher(url).matches();       
Prabhu
fonte
0
new java.net.URL(String) throws MalformedURLException
Kreker
fonte