2013-03-07 2 views
2

L'une des fonctions de mon application envoie des données via Internet. Avant d'envoyer les données, je vérifie si une connexion existe:Créer un AVD Android sans connexion 3G

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 fonctionné parfaitement bien sur émulateur et quelques dispositifs réels J'ai testé sur. Puis j'ai reçu un rapport d'erreur du client, qui sur l'enquête s'est avéré être NullPointerException sur getState ligne pour TYPE_MOBILE.

Apparemment, connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) a renvoyé null sur le périphérique qui n'avait pas 3G (une tablette WiFi uniquement). Bien que j'ai testé sur un émulateur Nexus 7, je n'ai pas eu cette erreur. Par conséquent, ce qui m'intéresse est de créer un AVD qui n'a pas explicitement 3G (c'est-à-dire un AVD pour un périphérique WiFi uniquement) 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 juste au mauvais endroit. Est-ce seulement possible?

Répondre

1

Je ne crois pas qu'il existe une solution simple à cela. Dans le même temps, j'ai adopté mon code pour ressembler à 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)); 
} 

Cela prend en charge les valeurs null lorsqu'une interface est pas présente.

3

Vous devriez pouvoir modifier les paramètres matériels d'un AVD pour retirer le modem. L'option est étiquetée hw.gsmModem, mais je crois que cela désactive toutes les connectivités de "données cellulaires", pas seulement 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 avd. Par défaut, le dossier se trouve à l'adresse:

  • Linux/Mac: ~/.android/AVD/yourAvdName

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

  • Windows XP: C: \ Documents and Settings \ .android \ yourAvdName

il suffit d'ajouter une ligne qui dit:

hw.gsmModem=no 

Voir here et here pour plus de détails.


Cependant, vous pourriez être en mesure de le tester en désactivant au lieu 3G, en appuyant sur F8 dans l'émulateur. Je ne sais pas si cela va simuler le nul que vous cherchez, mais ça vaut le coup. Pour plus de raccourcis, voir here.

+0

J'ai essayé de désactiver les données 3G - cela simule la désactivation des données 3G dans le téléphone - et les informations de connexion ne sont pas nulles, à la place, son getState revient déconnecté. Clairement ce n'est pas ce que je suis après. –

+0

Je ne peux même pas trouver où enlever hw.gsmModem. La dernière version du gestionnaire ADV ne me donne pas ces options. Je suppose, je pourrais traquer le xml pour l'avd, mais la désactivation de toutes les données de la cellule n'est pas une option pour moi. Je suppose que je vais juste ajouter des vérifications pour les nulls. –

+0

Je n'ai pas mis à jour mon gestionnaire AVD, mais vous n'en avez pas besoin pour changer les options. Edité avec des instructions. – Geobits

Questions connexes