Je veux vérifier quand le réseau de téléphone en Android s'éteint. Puis-je capturer cet événement?
Je ne reçois pas l'API appropriée ni aucun exemple qui expliquerait la même chose. Si quelqu'un l'avait fait ou des exemples de liens seraient vraiment utiles.
Nouvelle classe Java classe:
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();
}
}
}
Nouveau xml dans votre AndroidManifest.xml sous l'élément "manifest":
<!-- Needed to check when the network connection changes -->
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
Nouveau xml dans votre AndroidManifest.xml sous l'élément "application":
<receiver Android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
Android:label="NetworkConnection">
<intent-filter>
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
J'ai utilisé une petite configuration pour vérifier la bande passante pour déterminer comment mettre à l'échelle des choses, telles que des images.
Sous l'activité, dans AndroidManifest:
<intent-filter>
...
<action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
Dans l'activité où les contrôles sont effectués:
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 exemple d'utilisation serait alors:
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
}
Ce n'est pas le plus joli, mais cela permet une flexibilité suffisante pour que je puisse changer la limite de bande passante pour les éléments en fonction de ce qu'ils sont et de mes besoins pour eux.
Si vous utilisez Annotations Android est une option pour vous essayez ceci dans vos activités - c'est tout, le reste est généré:
@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
//react
}
N'utilisez ceci que si vous utilisez déjà AndroidAnnotations - mettre cette dépendance dans votre projet uniquement pour ce morceau de code serait exagéré.
La réponse ci-dessus ne fonctionne que si les données de paquets mobiles sont activées. Sinon, ConnectivityManager serait nul et vous ne pourrez plus récupérer NetworkInfo. La solution consiste à utiliser plutôt PhoneStateListener ou TelephonyManager.