Há mais de uma maneira
Primeiro, o caminho mais curto, mas ineficiente
Permissão de estado de rede necessária apenas
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Então este método,
public boolean activeNetwork () {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
return isConnected;
}
Como visto nas respostas, ConnectivityManager
é uma solução, eu apenas o adicionei dentro de um método. Este é um método simplificado. Todo uso
ConnectivityManager
retorna true se houver acesso à rede e não à Internet, significa que se o seu WiFi estiver conectado a um roteador, mas o roteador não tiver Internet retorna true, verifica a disponibilidade da conexão
Segundo, maneira eficiente
Estado da rede e permissões da Internet necessárias
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
Então esta aula,
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
private Context context;
public CheckInternetAsyncTask(Context context) {
this.context = context;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
HttpURLConnection urlc = (HttpURLConnection)
(new URL("http://clients3.google.com/generate_204")
.openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
if (urlc.getResponseCode() == 204 &&
urlc.getContentLength() == 0)
return true;
} catch (IOException e) {
Log.e("TAG", "Error checking internet connection", e);
return false;
}
} else {
Log.d("TAG", "No network available!");
return false;
}
return null;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
Log.d("TAG", "result" + result);
if(result){
// do ur code
}
}
}
Ligar CheckInternetAsyncTask
new CheckInternetAsyncTask(getApplicationContext()).execute();
Algumas explicações: -
você tem que verificar a Internet AsyncTask
, caso contrário, pode jogar android.os.NetworkOnMainThreadException
em alguns casos
ConnectivityManager
usado para verificar o acesso à rede se true envia solicitação (Ping)
Solicitar envio para http://clients3.google.com/generate_204
, Este conhecido URL é conhecido por retornar uma página vazia com um status HTTP 204, que é mais rápido e mais eficiente do que http://www.google.com
, leia isto . se você tiver um site, é preferível colocá-lo no lugar do google, somente se você o usar no aplicativo
O intervalo pode ser alterado (20ms -> 2000ms), 1500ms é comumente usado
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Veja minha resposta para uma implementação melhor disso. Entre a resposta aceita (e muitas outras aqui), basta verificar se há uma conexão de rede , não a Internet.