2 votes

Créer un AVD Android sans connexion 3G

L'une des fonctions de mon application envoie des données sur l'internet. Avant de tenter d'envoyer les données, je vérifie si une connexion existe :

private boolean isConnected() {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo.State val1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
    NetworkInfo.State val2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
    return NetworkInfo.State.CONNECTED.equals(val1) || NetworkInfo.State.CONNECTED.equals(val2);
}

Cela a parfaitement fonctionné sur l'émulateur et sur quelques appareils réels que j'ai testés. J'ai ensuite reçu un rapport d'erreur du client, qui, après enquête, s'est avéré être une erreur de type NullPointerException en getState ligne pour TYPE_MOBILE .

Apparemment, connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) retourné null sur l'appareil qui ne disposait pas de la 3G (une tablette Wi-Fi uniquement). Bien que j'aie testé sur un émulateur Nexus 7, je n'ai pas obtenu cette erreur.

Par conséquent, ce qui m'intéresse, c'est de créer un AVD qui n'a explicitement pas de 3G (c'est-à-dire un AVD pour un appareil WiFi-only) afin que je puisse étudier/tester de tels scénarios. Je n'ai rien trouvé dans les options de l'émulateur, mais peut-être que je cherche au mauvais endroit. Est-ce que c'est possible ?

3voto

Geobits Points 12623

Vous devriez pouvoir modifier les paramètres matériels d'un AVD pour supprimer le modem. L'option est intitulée hw.gsmModem Je ne sais pas si c'est le cas, mais je crois qu'il désactive toutes les connexions "données cellulaires", et pas seulement le GSM.

Si vous souhaitez modifier les options matérielles sans utiliser le gestionnaire AVD, modifiez le fichier config.ini qui se trouve dans le dossier de l'avd. Par défaut, le dossier est situé à l'adresse suivante

  • Linux/Mac : ~/.Android/avd/votreNomDeDvd

  • Windows Vista/7/(8 ?): C:\Users\.android\yourAvdName

  • Windows XP : C:\Documents et réglages \.android\yourAvdName

Il suffit d'ajouter une ligne qui dit :

hw.gsmModem=no

Véase aquí y aquí pour plus de détails.


Cependant, vous pouvez peut-être le tester en désactivant la 3G, en appuyant sur F8 dans l'émulateur. Je ne sais pas si cela simulera la nullité que vous recherchez, mais cela vaut la peine d'essayer.

Véase aquí pour d'autres raccourcis.

1voto

Aleks G Points 25412

Je ne crois pas qu'il y ait de solution simple à ce problème. En attendant, j'ai adopté mon code pour qu'il ressemble à ceci :

private boolean isConnected(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    NetworkInfo info2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo.State val1 = (info1 == null ? null : info1.getState());
    NetworkInfo.State val2 = (info2 == null ? null : info2.getState());
    return (info1 != null && NetworkInfo.State.CONNECTED.equals(val1)) || (info2 != null && NetworkInfo.State.CONNECTED.equals(val2));
}

Il s'agit de null lorsqu'une interface n'est pas présente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X