5

Une fois que j'ai eu un problème, vous avez été très utile. Donc là je suis encore avec un autre problème que je suis tombé sur ...:/getBoolean (EXTRA_NO_CONNECTIVITY) renvoie toujours false

Je cours un récepteur réseau personnalisé qui étend BroadcastReceiver. Je veux détecter quand le téléphone a une connexion Internet afin que je puisse démarrer un service quand il le fait. J'ai lu beaucoup de sujets et tous les sujets plus ou moins rapide au code suivant qui ne fonctionne pas pour moi:

public class NetworkReceiver extends BroadcastReceiver { 

private static final String tag = NetworkReceiver.class.getSimpleName(); 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(tag,"****** NetworkReceiver // onReceive()"); 

    boolean noConnection = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
     Log.i(tag,"****** NetworkReceiver // Network Down?: " + intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)); 
    } 

    // TODO Bug: Never stops the service. Stays always connected! 
    if(noConnection) { 
     Log.i(tag,"****** NetworkReceiver // Stopping Service..."); 
     context.stopService(new Intent(context, FetchService.class)); 
    } else { 
     Log.i(tag,"****** NetworkReceiver // Starting Service!"); 
     context.startService(new Intent(context, FetchService.class)); 
    } 
} 

Le problème que j'ai est que le logcat retourne toujours NetworkDown?: false et le service ne cesse jamais (il redémarre tout le temps). Je l'ai essayé sur l'émulateur en appuyant sur F8 et je l'ai aussi essayé sur mon dev-phone (il n'a pas de carte SIM, l'accès internet se fait par mon routeur wifi) en éteignant le routeur -> pas d'accès internet garanti!

Mon Manifest comprend les lignes suivantes:

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

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

Je tiens également à noter que j'ai aussi essayé <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> dans mon dossier manifeste sans changement et que lorsque j'ai modifié la ligne: intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) à intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true) le résultat était toujours vrai - et donc il a toujours essayé d'arrêter mon service et de ne jamais le démarrer.

Je suspecte que les extras de l'intention ne sont pas lus du tout et c'est pourquoi la valeur par défaut de getBooleanExtra() revient toujours.

PS. Je suis sur Android 2.1

Merci!

Répondre

3

Je ne suis pas sûr pour les extras qui ne peuvent pas être lus à l'intérieur du BroadcastReceiver, mais je peux vous montrer comment j'utilise le BroadcastReceiver dans un but similaire à la vôtre.

Mon récepteur n'attrape que les modifications de connectivité, mais il n'évalue PAS l'état de la connectivité. Il informe le Service plutôt que dans les deux cas (connecté ou non) ce service aura quelque chose à faire. Ce service peut être en cours d'exécution ou non à ce moment-là, il sera soit commencé ou « informé » (rappelez-vous que you can safely call startService() several times, ces appels ne NEST):

public class ConnectivityReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Intent intentService = new Intent(context, MyService.class); 
     intentService.putExtra(MyService.INTENT_HANDLE_CONNECTIVITY_CHANGE, ""); 

     context.startService(intentService); 
    } 
} 

Puis, dans mon service, je n'évaluent la connectivité, puis agir en conséquence. Notez que je n'évalue pas l'état de connexion de la même manière que vous le faites, et cela pourrait être la raison pour laquelle le code ci-dessous fonctionne, mais pas le vôtre (ci-dessous est le code correspondant uniquement):

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     final Bundle bundle = intent.getExtras(); 

     // Handle the intent INTENT_HANDLE_CONNECTIVITY_CHANGEif any 
     if ((bundle != null) && (bundle.get(INTENT_HANDLE_CONNECTIVITY_CHANGE) != null)) {   
      handleConnectivity(); 
     } 
    } 

    return START_STICKY; 
} 

private void handleConnectivity() { 
    final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

    if(netInfo != null && netInfo.isConnected()) { 
     // WE ARE CONNECTED: DO SOMETHING 
    } 
    else { 
     // WE ARE NOT: DO SOMETHING ELSE  
    } 
} 

Cela fonctionne bien, sous Android-7 (2.1) aussi.

+0

Je connais la méthode que vous avez utilisée. Cependant, j'étais un peu surpris que beaucoup de gens ont recommandé le code que j'ai utilisé (je l'ai également lu sur un livre O'reilly que j'ai récemment acheté sur android!Si je ne trouve pas de solution avec la diffusion CONNECTIVITY_ACTION, je pense que je vais suivre votre exemple et faire une vérification dans mon service avec les méthodes de ConnectivityManager. Merci pour la réponse :) – snoopaki

+0

Vous êtes les bienvenus @snoopaki - en fait j'aurais préféré venir avec une solution en utilisant votre méthode, mais je ne vois tout simplement pas ce qui se passe et pourquoi. – Shlublu

+1

En fait, j'ai changé mon service en IntentService et la gestion en service du changement de connectivité était plus logique. Donc, je devrais probablement choisir votre réponse comme la bonne !! Merci :) – snoopaki

2

Je ne sais pas l'étrange drapeau NO_CONNECTIVITY, mais vous pouvez récupérer le réseau actif de l'intention:

(NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

Vous pouvez probablement appeler isConnected() sur cet objet.

+1

Merci pour la réponse, je vais le garder à l'esprit. Pour la tâche en cours, j'ai utilisé la réponse ci-dessus et ça marche plutôt bien. :) – snoopaki

+1

Cette constante est maintenant obsolète. –

Questions connexes