web-dev-qa-db-fra.com

malheureusement, l'application s'arrête lors de la vérification du réseau

J'utilise le code suivant pour vérifier la connexion Internet dans mon application.

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();
    }
  }
}

Et j'ai défini l'autorisation requise dans le fichier manifeste.

Chaque fois que j'essaie de déconnecter/connecter le réseau à l'aide de la touche F8, je recevrai "L'APPLICATION MORTUAIRE A ARRÊTÉ" , et je ne reçois aucune impression dans logcat.

Puis-je savoir quelle est l'erreur que je fais?

19
Beginner

REMARQUE: Si vous ciblez Android N Preview. Le récepteur ci-dessus ne fonctionnera pas selon les contraintes restreintes par Google.

Lien: https://developer.Android.com/preview/features/background-optimization.html#connectivity-action

Utilisez: WorkManager ou JobScheduler pour cela.


Avez-vous ajouté ceci dans AndroidManifest.xml?

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

si vous avez ajouté ci-dessus, vérifiez ce code:

<receiver Android:name=".UpdateReceiver" >
    <intent-filter>
        <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

et

public class UpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

          ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE );
          NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
          boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting();   
          if (isConnected)       
              Log.i("NET", "Connected" + isConnected);   
          else 
              Log.i("NET", "Not Connected" + isConnected);
    }
}

64
Dhaval Parmar

Le code ci-dessus ne fonctionnait pas correctement pour la connexion Wi-Fi. Ceci est le Modifié

SIMPLE ONE

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

à l'intérieur de la balise d'application de androidmanifest.xml

<receiver Android:name="Android.YOUR-Java-CLASS-PATH.BackgroundSync" Android:enabled="true">
      <intent-filter>
          <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE" />
      </intent-filter>
</receiver>

BackgroundSync.Java

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.net.ConnectivityManager; 
import Android.util.Log;
import Android.widget.Toast;

public class BackgroundSync extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) { 
        ConnectivityManager cm =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm.getActiveNetworkInfo()!=null){
            Toast.makeText(context, "Connected to Internet", Toast.LENGTH_LONG).show();
        }
        else Log.i("INTERNET","---------------------> Internet Disconnected. ");
    }
}
6
shreedhar bhat

Les applications ciblant Android 7.0 (API niveau 24) et plus ne reçoivent pas cette diffusion si elles déclarent le récepteur de diffusion dans leur manifeste. Les applications recevront toujours des diffusions si elles enregistrent leur BroadcastReceiver avec Context.registerReceiver ( ) et ce contexte est toujours valable.

https://developer.Android.google.cn/reference/Android/net/ConnectivityManager.html?hl=zh-cn#CONNECTIVITY_ACTION

1
BJDM