Pregunta Detecta si hay una conexión a Internet disponible en Android [duplicado]


Posible duplicado:
¿Cómo verificar el acceso a Internet en Android? InetAddress nunca supera los tiempos de espera 

Necesito detectar si el dispositivo Android está conectado a Internet.

los NetworkInfo clase proporciona un método no estático isAvailable() eso suena perfecto.

El problema es que:

NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
    // do something
}

arroja este error:

The constructor NetworkInfo is not visible.

La apuesta segura es que hay otra clase que devuelve un NetworkInfo objeto. Pero no sé cuál.

  1. ¿Cómo hacer que funcione el fragmento de código anterior?
  2. ¿Cómo podría haber encontrado la información que necesitaba en la documentación en línea?
  3. ¿Puedes sugerir una forma mejor para este tipo de detección?

577
2017-11-21 16:35


origen


Respuestas:


los getActiveNetworkInfo() método de ConnectivityManager devuelve un NetworkInfo instancia que representa la primera interfaz de red conectada que puede encontrar o null si ninguna de las interfaces está conectada. Comprobando si este método regresa null debería ser suficiente para saber si hay una conexión a Internet disponible o no.

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

También necesitarás:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

en su manifiesto de Android.

Editar:

Tenga en cuenta que tener una interfaz de red activa no garantiza que un determinado servicio de red esté disponible. Los problemas de red, el tiempo de inactividad del servidor, la baja señal, los portales cautivos, los filtros de contenido y similares pueden evitar que su aplicación llegue a un servidor. Por ejemplo, no puede decir con certeza si su aplicación puede llegar a Twitter hasta que reciba una respuesta válida del servicio de Twitter.


1247
2017-11-21 16:53



Compruebo tanto Wi-Fi como Internet móvil de la siguiente manera ...

private boolean haveNetworkConnection() {
    boolean haveConnectedWifi = false;
    boolean haveConnectedMobile = false;

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] netInfo = cm.getAllNetworkInfo();
    for (NetworkInfo ni : netInfo) {
        if (ni.getTypeName().equalsIgnoreCase("WIFI"))
            if (ni.isConnected())
                haveConnectedWifi = true;
        if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
            if (ni.isConnected())
                haveConnectedMobile = true;
    }
    return haveConnectedWifi || haveConnectedMobile;
}

Obviamente, podría modificarse fácilmente para verificar tipos de conexión específicos individuales, por ejemplo, si su aplicación necesita velocidades potencialmente mayores de Wi-Fi para funcionar correctamente, etc.


213
2017-11-21 18:12



Paso 1: Crea un AppStatus de clase en tu proyecto (también puedes asignar otro nombre). Luego, pegue las siguientes líneas en su código:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;


public class AppStatus {

    private static AppStatus instance = new AppStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static AppStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

    public boolean isOnline() {
        try {
            connectivityManager = (ConnectivityManager) context
                        .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isAvailable() &&
                networkInfo.isConnected();
        return connected;


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

Paso 2: ahora, para verificar si tu dispositivo tiene conectividad de red, simplemente agrega este fragmento de código donde quieras ...

if (AppStatus.getInstance(this).isOnline()) {

    Toast.makeText(this,"You are online!!!!",8000).show();

} else {

    Toast.makeText(this,"You are not online!!!!",8000).show();
    Log.v("Home", "############################You are not online!!!!");    
}

63
2017-08-08 19:30



También otra nota importante. Tienes que establecer android.permission.ACCESS_NETWORK_STATE en su AndroidManifest.xml para que esto funcione.

_ ¿Cómo podría haber encontrado la información que necesitaba en la documentación en línea?

Solo tiene que leer la documentación de las clases lo suficientemente bien y encontrará todas las respuestas que está buscando. Consulte la documentación en ConnectivityManager. La descripción te dice qué hacer.


14
2017-11-21 17:01



El método getActiveNetworkInfo () de ConnectivityManager devuelve un   Instancia de NetworkInfo que representa la primera red conectada   interfaz que puede encontrar o nulo si no hay ninguna si las interfaces están conectadas.   Comprobar si este método devuelve nulo debería ser suficiente para saber si   conexión a internet está disponible.

private boolean isNetworkAvailable() {
     ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
     return activeNetworkInfo != null; 
}

También necesitarás:

 en tus   manifiesto de Android.

Editar:

Tenga en cuenta que tener una interfaz de red activa no garantiza que una   un servicio en red particular está disponible. Problemas de redes, servidor   tiempo de inactividad, baja señal, portales cautivos, filtros de contenido y similares   todos pueden evitar que su aplicación llegue a un servidor. Por ejemplo, tú   no puede decir con certeza si su aplicación puede llegar a Twitter hasta que reciba una   respuesta válida del servicio de Twitter.

getActiveNetworkInfo () nunca debería dar nulo. No sé en qué estaban pensando cuando se les ocurrió eso. Debería darte un objeto siempre.


10
2017-08-20 14:03



Probablemente me he encontrado a mí mismo:

ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();

7
2017-11-21 16:57