2009-11-23 21 views
60

Quiero verificar cuándo se activa la red del teléfono en Android. ¿Puedo capturar ese evento?Oyente de red Android

No obtengo la API adecuada ni ningún otro ejemplo que explique lo mismo. Si alguien hubiera hecho o algún ejemplo, los enlaces serían realmente útiles.

Respuesta

144

Nueva clase java:

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null) 
    { 
     Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    if(mobNetInfo != null) 
    { 
     Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

Nueva XML en sus AndroidManifest.xml bajo el elemento "manifiesto":

<!-- Needed to check when the network connection changes --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

Nueva xml en su AndroidManifest.xml bajo el elemento "aplicación":

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
+0

hey Gracias funcionó como se esperaba – Sam97305421562

+0

como @noillusioin dice, el activeNetInfo puede ser nulo. Esto es una indicación de que la conexión de red SIMPLEMENTE SE DESCONECTÓ si usted sabe (estado guardado) que usted estaba conectado previamente. – larham1

+0

También debe verificar NetworkInfo.isConnected – shuriquen

7

La respuesta anterior solo funciona si los datos de paquetes móviles están habilitados. De lo contrario, ConnectivityManager sería nulo y ya no podrá recuperar NetworkInfo. La forma de evitarlo es utilizar un PhoneStateListener o un TelephonyManager.

16

He estado usando una configuración pequeña para verificar el ancho de banda y determinar cómo escalar cosas, como las imágenes.

Bajo la actividad, en AndroidManifest:

<intent-filter> 
... 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
</intent-filter> 

En la actividad donde se llevan a cabo las comprobaciones:

boolean network; 
int bandwidth; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    network = isDataConnected(); 
    bandwidth = isHighBandwidth(); 
    registerReceiver(new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      network = isDataConnected(); 
      bandwidth = isHighBandwidth(); 
     } 
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
} 
... 
private boolean isDataConnected() { 
    try { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

private int isHighBandwidth() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info.getType() == ConnectivityManager.TYPE_WIFI) { 
     WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     return wm.getConnectionInfo().getLinkSpeed(); 
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { 
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     return tm.getNetworkType(); 
    } 
    return 0; 
} 

Un ejemplo de uso sería entonces:

if (network) { 
    if (bandwidth > 16) { 
     // Code for large items 
    } else if (bandwidth <= 16 && bandwidth > 8) { 
     // Code for medium items 
    } else { 
     //Code for small items 
    } 
} else { 
    //Code for disconnected 
} 

¡Es no es el más bonito, pero permite la suficiente flexibilidad como para cambiar el límite de ancho de banda para los elementos de pendiente de lo que son y mis requisitos para ellos.

+0

Me pareció muy útil, gracias :) – Skynet

9

Si se utiliza Android Annotations es una opción para intentar esto en sus actividades - eso es todo, el resto se genera:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, 
     registerAt = Receiver.RegisterAt.OnResumeOnPause) 
void onConnectivityChange() { 
    //react 
} 

Uso esto sólo si ya utiliza AndroidAnnotations - poniendo esta dependencia dentro de su proyecto sólo para este pedazo de código sería excesivo.

+0

¿Puede dar más explicaciones sobre esta respuesta? Intenté encontrar algo pero no pude. No hay una anotación @Receiver en la biblioteca de anotaciones de Google. ¡Gracias! – Sniper

+0

Hola, me refiero a la biblioteca de terceros AndroidAnnotations. Actualizo mi respuesta. –

+0

Sí, está bien, con esta biblioteca es posible y también encontré este https://github.com/jd-alexander/flender no lo compruebe, pero puede usarlo solo con gradle build 1.3, con los nuevos complementos de compilación gradle no funciona – Sniper