Android: verifique a rede e a conectividade real à Internet
Abaixo está o código do Android que funciona bem para verificar se a rede está conectada ou não.
public static boolean isNetworkAvailable(Context context)
{
ConnectivityManager mConnectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
return (mConnectivityManager != null && mConnectivityManager.getActiveNetworkInfo().isConnectedOrConnecting()) ? true : false;
}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Mas ter uma interface de rede ativa não garante que um serviço de rede específico esteja disponível.
Muitas vezes acontece que estamos conectados à rede, mas ainda não alcançáveis a serviços comuns de rede da Internet, por exemplo, Google
Cenário comum:
Dispositivo Android conectado a um Wi-Fi, que acaba sendo uma rede privada. Portanto, isNetworkAvailable retornará que a rede está conectada, mas não pôde ser conectada a nenhum outro serviçoAlgumas vezes o sinal do telefone mostra que está conectado ao plano de dados do provedor de serviços. portanto, a conectividade de rede é verdadeira, mas ainda não pode acessar o Google / Yahoo.Uma maneira é verificar se a função "isNetworkAvailable" retorna TRUE e execute o seguinte código
HttpGet request = new HttpGet(url));
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 60000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
request.addHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
result = EntityUtils.toString(entity);
}
}
catch (SocketException e)
{
return "Socket Exceptiopn:" + e.toString();
}
catch (Exception e)
{
return "General Execption:" + e.toString();
}
Mas acho que esse não é um bom caminho, pois pode consumir muito tempo
Portanto, existe alguma maneira alternativa eficiente (em termos de tempo gasto, velocidade) para garantir que estamos conectados à rede e também acessíveis aos serviços de Internet mais comuns?