2010-06-09 9 views
28

Ich arbeite an einer Push-Benachrichtigungen-Bibliothek für Android (http://deaconproject.org/), die Maßnahmen ergreifen muss, wenn die Netzwerkverbindung unterbrochen oder geändert wird - nämlich eine Serververbindung neu initiieren oder den Betrieb anhalten muss, bis Netzwerkverbindung verfügbar ist. Dies funktioniert gut mit Android BroadcastReceiver für "android.net.ConnectivityManager.CONNECTIVITY_ACTION".Wie zum Deaktivieren/Aktivieren von Netzwerk, wechseln Sie zu Wifi in Android-Emulator?

Mein Problem besteht darin, die Bibliothek zu testen - ich möchte automatisch die Antwort der Bibliothek auf eine unterbrochene Netzwerkverbindung oder einen Übergang von 3G zu WiFi unter verschiedenen Konfigurationsbedingungen testen. Das Problem ist, ich möchte nicht mit dem Emulator sitzen und den ganzen Tag F8 drücken.

Gibt es eine Möglichkeit, Netzwerkverbindungen auf Android innerhalb eines jUnit-Tests programmgesteuert zu manipulieren, ohne auf den Flugzeugmodus umschalten zu müssen? Ich habe bereits versucht, Befehle an den Emulator über die Konsole auszugeben, den GSM-Modus zu manipulieren usw., aber während sich der Telefonstatus auf dem Display ändert, bleibt die Internetverbindung bestehen.

+1

Haben Sie jemals eine Lösung für dieses Problem gefunden? – pehrs

+0

Möchte auch eine Antwort wissen. Irgendwelche Ideen? –

+0

Siehe auch [diese Frage] (http://stackoverflow.com/questions/8198889/testing-in-airplane-mode-in-android-emulator). –

Antwort

7

Klicken Sie mit der rechten Maustaste auf das Projekt im "Project Explorer" Panel, wählen Sie "Run As" und dann "Run Configurations".

Auf der linken Seite des modal angezeigten Fensters wählen Sie "Android Application" und auf der rechten Seite des gleichen Fensters, wählen Sie die Registerkarte "Target".

Am unteren Rand des Fensters, im Abschnitt "Emulator Startparameter" haben Sie eine Fülle von Optionen in Bezug auf Internet-Konnektivität.

Ich hoffe, das hat geholfen.

Igor

+7

Vielen Dank für Ihre Antwort - Dies ist ein Schritt in die richtige Richtung. Die Emulatorstartparameter können die Netzwerkkonnektivität beim Systemstart anpassen, aber wir suchen nach einer Möglichkeit, dies zur Laufzeit programmgesteuert durchzuführen. Die zu testende Bibliothek muss auf Android Broadcast Intents antworten (z. B. android.net.ConnectivityManager.CONNECTIVITY_ACTION), um ihren Status an den Netzwerkstatus des Geräts anzupassen. Was wir brauchen, ist eine Möglichkeit, den Netzwerkstatus innerhalb des JUnit-Tests zu ändern, so dass wir überprüfen können, ob die Intents empfangen und entsprechend gehandelt werden. – mtbkrdave

4

Sie könnten auch an der Emulator Steuer Ansicht in Eclipse zu suchen. Ich habe nicht viel Glück, es zu bekommen, um meine Daten im Moment zu töten, aber es sieht so aus sollte.

alt text

+0

Ich habe diese Option versucht, obwohl über die Console ADB-Verbindung, aber es scheint Connectivity nicht wirklich zu entfernen; Trotz meines Ausschaltens der GSM-Datenverbindung funktioniert der Netzwerkverkehr immer noch. Was ich hier suche, ist ein Weg, es * programmatisch * zu tun - im Rahmen eines automatisierten Tests, beispielsweise eines JUnit-Tests. – mtbkrdave

+0

Ich hatte das gleiche Problem (die Kommunikation scheint weiterzugehen). Es klingt, als ob Sie einen Weg gefunden haben, dies über die ADB-Shell zu skripten (sollte es wieder funktionieren oder wir stolpern über die richtigen Steuerbefehle). FYI Ich war auch in der Lage, einige Netzwerkeinstellungen (das gleiche Problem besteht jedoch) über Telnet auf die Emu und die GSM-Daten aus und GSM Off-Befehle wechseln ala http://stackoverflow.com/questions/2577785/ringing-myself- using-android-emulator/2578245 # 2578245 – Chris

+0

Danke für den Hinweis, änderte diese Status zu 'unregistriert' für mich. Keine Ahnung von Unit Tests. – Walf

6

Ich habe die Android Dev Tools App wirklich hilfreich.

Es ermöglicht Ihnen, wichtige Systemeinstellungen wie Netzwerkkonnektivität zu manipulieren. Sie können sogar ein Zeitintervall festlegen, in dem das WLAN automatisch ein- und ausgeschaltet wird, sodass Sie Ihre netzwerkbezogenen Broadcast-Empfänger testen können.

Wenn Sie die Dev Tools-Anwendung auf einem echten Entwicklung Gerät installieren möchten, können Sie die Anwendung von Ihrem Emulator kopieren und installieren Sie es dann auf Ihrem Gerät ADB verwenden. Um die Anwendung aus einem laufenden Emulator zu kopieren, führen:

adb -e pull /system/app/Development.apk ./Development.apk 

Dies kopiert die APK-Datei in das aktuelle Verzeichnis. installieren Sie es dann auf dem angeschlossenen Gerät mit:

adb -d install Development.apk 

enter image description here

+3

Dies ist hilfreich für diejenigen, die den Netzwerkzustand manuell ändern möchten, aber die Frage hier ist auf der Suche nach einer Möglichkeit, dies programmgesteuert (d. H. Von einem Komponententest) zu tun. Könnte dies mit einer Absicht geschehen, die an die Dev Tools-Anwendung gesendet wird? – mtbkrdave

4

Leider gibt es keine Möglichkeit, wirklich zu deaktivieren Netzwerkzugriff von innerhalb programmatisch einer Unit-Test.Ich habe eine Android enhancement request für dieses Problem eingereicht.

0

Eine einfache, aber ein bisschen lang und schwer, Lösung ist auch eine Abstraktionsschicht über Ihre Wifi Verbindung State Monitor hinzufügen.

Fügen Sie eine Entity (NetworkStateManager) hinzu, sollte es eine Anwendung im Bereich Singleton (siehe RoboGuice oder Dagger auf diese sauber, oder Zugriff auf die eindeutige Instanz über Ihre Anwendungsinstanz).

Fügen Sie Methoden zum Registrieren hinzu, heben Sie die Registrierung von Listenern für diese Entität auf, indem Sie das Observable Observer-Entwurfsmuster verwenden.

Jede Aktivität muss sich bei onStart registrieren, in onStop aufheben.

Die Entität selbst wird von einem BroadCastReceiver modifiziert.

Das ist vollständig testbar, wenn Sie ein DI-Framework verwenden, können Sie einen treibbaren Stub in Ihre Aktivitäten injizieren und sehen, wie sie auf Änderungen des Netzwerkstatus reagieren.

Verwandte Themen