Ich möchte, dass mein Code auf dem Emulator etwas anders ausgeführt wird als auf einem Gerät. ( Verwenden Sie beispielsweise 10.0.2.2 anstelle einer öffentlichen URL, um automatisch auf einem Entwicklungsserver ausgeführt zu werden.) Wie lässt sich am besten erkennen, wenn eine Android-Anwendung im Emulator ausgeführt wird?
android
android-emulator
Joe Ludwig
quelle
quelle
android.os.Build
.Antworten:
Wie wäre es mit dieser Lösung:
Beachten Sie, dass einige Emulatoren die genauen Spezifikationen realer Geräte vortäuschen, sodass sie möglicherweise nicht erkannt werden können.
Hier ein winziger Ausschnitt, den Sie in der APK erstellen können, um verschiedene Dinge darüber zu zeigen, sodass Sie Ihre eigenen Regeln hinzufügen können:
quelle
Eine häufige scheint zu sein
Build.FINGERPRINT.contains("generic")
quelle
FINGERPRINT
Wert zu interpretieren .Nun, die Android-ID funktioniert bei mir nicht. Ich verwende derzeit:
quelle
Basierend auf Hinweisen aus anderen Antworten ist dies wahrscheinlich der robusteste Weg:
isEmulator = "goldfish".equals(Build.HARDWARE)
quelle
isEmulator = Build.HARDWARE.contains("golfdish")
Google verwendet diesen Code im Geräte-Info-Plugin von Flutter, um festzustellen, ob das Gerät ein Emulator ist:
quelle
Wie wäre es mit dem folgenden Code, um festzustellen, ob Ihre App mit dem Debug-Schlüssel signiert wurde? Es erkennt den Emulator nicht, aber es könnte für Ihren Zweck funktionieren?
quelle
BuildConfig.DEBUG
.Dieser Code funktioniert für mich
Falls dieses Gerät keine SIM-Karte hat, wird die leere Zeichenfolge erneut ausgeführt: ""
Da der Android-Emulator "Android" als Netzwerkbetreiber immer neu abstimmt, verwende ich den obigen Code.
quelle
Beide folgenden Elemente sind auf "google_sdk" festgelegt:
Es sollte also ausreichen, eine der folgenden Zeilen zu verwenden.
oder
quelle
sdk_x86
.Ich habe verschiedene Techniken ausprobiert, mich jedoch für eine leicht überarbeitete Version der Überprüfung von Build.PRODUCT wie folgt entschieden. Dies scheint von Emulator zu Emulator ziemlich unterschiedlich zu sein, deshalb habe ich die 3 Schecks, die ich derzeit habe. Ich denke, ich hätte einfach überprüfen können, ob product.contains ("sdk") enthält, fand aber, dass die Überprüfung unten etwas sicherer war.
Zu Ihrer Information - Ich habe festgestellt, dass mein Kindle Fire Build.BRAND = "generic" hat und einige der Emulatoren kein "Android" für den Netzbetreiber hatten.
quelle
Ich sehe nur
_sdk
,_sdk_
odersdk_
, oder auch nursdk
teilweise inBuild.PRODUCT
:quelle
contains("sdk")
? Der einzige Unterschied (außer schneller zu sein) ist dermatches(".*_?sdk_?.*")
, dass ein Zeichen vor oder nach sdk ein Unterstrich '_' sein muss, was nicht allzu wichtig ist, um es zu überprüfen.Ich habe nie einen guten Weg gefunden, um festzustellen, ob Sie im Emulator sind.
Wenn Sie jedoch nur feststellen müssen, ob Sie sich in einer Entwicklungsumgebung befinden, können Sie Folgendes tun:
Ich hoffe das hilft....
quelle
Verwenden Sie diese Funktion:
quelle
Ich weiß nicht, ob es bessere Möglichkeiten gibt, die Emu zu erkennen, aber der Emulator hat die Datei
init.goldfish.rc
im Stammverzeichnis.Es ist das emulatorspezifische Startskript und sollte bei einem Nicht-Emulator-Build nicht vorhanden sein.
quelle
Hier ist meine Lösung (funktioniert nur, wenn Sie einen Webserver auf Ihrem Debug-Computer ausführen): Ich habe eine Hintergrundaufgabe erstellt, die beim Start der Anwendung gestartet wird. Es sucht nach http://10.0.2.2 und wenn es existiert, ändert es einen globalen Parameter (IsDebug) in true. Es ist ein stiller Weg, um herauszufinden, wo Sie laufen.
von der Hauptaktivität onCreate:
quelle
Von der Batterie, dem Emulator: Die Stromquelle ist immer ein Wechselstromladegerät. Die Temperatur ist immer 0.
Und Sie können verwenden
Build.HOST
, um Host-Wert aufzuzeichnen, unterschiedliche Emulatoren haben unterschiedliche Host-Werte.quelle
Eine andere Möglichkeit wäre, sich die Eigenschaft ro.hardware anzusehen und zu prüfen, ob sie auf Goldfisch eingestellt ist. Leider scheint es keinen einfachen Weg zu geben, dies von Java aus zu tun, aber es ist trivial von C mit property_get () .
quelle
Die oben vorgeschlagene Lösung zur Überprüfung auf die
ANDROID_ID
sie für mich funktioniert hat, bis ich heute auf die neuesten SDK-Tools aktualisiert habe, die mit Android 2.2 veröffentlicht wurden.Daher habe ich derzeit auf die folgende Lösung umgestellt, die bisher mit dem Nachteil funktioniert, dass Sie jedoch die Leseberechtigung PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
) eingeben müssen.quelle
Alle Antworten in einer Methode
quelle
init.goldfish.rc
existiert nur in Emulatoren; Zusätzlich zu den Build-Details ist dies eine gute Überprüfung für die Zukunft.Ich habe den neuen Emulator gefunden
Build.HARDWARE = "ranchu"
.Referenz: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
Und ich habe auch den offiziellen Weg für Android gefunden, um zu überprüfen, ob Emulator oder nicht. Ich denke, es ist eine gute Referenz für uns.
Wir müssen
ScreenShapeHelper.IS_EMULATOR
prüfen, ob Emulator.Wir müssen
Build.IS_EMULATOR
prüfen, ob Emulator.Die Art und Weise, wie der Beamte prüft, ob der Emulator nicht neu ist, und vielleicht auch nicht genug, sind die oben genannten Antworten ebenfalls erwähnt.
Aber dies zeigt uns vielleicht, dass der Beamte die Möglichkeit bietet, zu prüfen, ob der Emulator oder nicht.
Da wir die oben genannten Methoden verwenden, können wir jetzt auch die beiden Methoden verwenden, um zu überprüfen, ob der Emulator vorhanden ist.
So greifen Sie auf das
com.android.internal
Paket zu und@hide
und warten Sie auf das offizielle offene SDK.
quelle
Meine Empfehlung:
versuchen Sie dies von Github.
Einfach zu erkennender Android Emulator
Verwendung mit einem Beispiel:
quelle
Sie können die IMEI-Nummer http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29 überprüfen
Wenn ich mich auf dem Emulator an diese Rückgabe 0 erinnere, gibt es jedoch keine Dokumentation, die dies garantiert. Obwohl der Emulator möglicherweise nicht immer 0 zurückgibt, scheint es ziemlich sicher zu sein, dass ein registriertes Telefon nicht 0 zurückgibt. Was würde auf einem Android-Gerät ohne Telefon oder einem Gerät ohne installierte SIM-Karte oder einem Gerät geschehen, das derzeit nicht auf dem Android-Gerät registriert ist Netzwerk?
Das scheint eine schlechte Idee zu sein, sich darauf zu verlassen.
Dies bedeutet auch, dass Sie um Erlaubnis bitten müssen, um den Telefonstatus zu lesen. Dies ist schlecht, wenn Sie ihn nicht bereits für etwas anderes benötigen.
Wenn nicht, wird immer irgendwo etwas umgedreht, bevor Sie schließlich Ihre signierte App generieren.
quelle
0
auf einem Android-Tablet oder einem Telefon ohne SIM-Karte zurückkehren.Dies sollte true zurückgeben, wenn die App auf einem Emulator ausgeführt wird.
Wir sollten vorsichtig sein, wenn nicht alle Emulatoren erkannt werden, da es nur mehrere verschiedene Emulatoren gibt. Es ist leicht zu überprüfen. Wir müssen sicherstellen, dass tatsächliche Geräte nicht als Emulator erkannt werden.
Ich habe die App " Android Device Info Share " verwendet, um dies zu überprüfen.
In dieser App können Sie verschiedene Arten von Informationen zu vielen Geräten anzeigen (wahrscheinlich die meisten Geräte auf der Welt; wenn das von Ihnen verwendete Gerät in der Liste fehlt, wird es automatisch hinzugefügt).
quelle
Tatsächlich entspricht ANDROID_ID auf 2.2 immer 9774D56D682E549C (gemäß diesem Thread + meinen eigenen Experimenten).
Sie könnten also so etwas überprüfen:
Nicht das schönste, aber es macht den Job.
quelle
Das funktioniert bei mir
quelle
Legen Sie eine Datei im Dateisystem des Emulators ab. Da die Datei auf dem realen Gerät nicht vorhanden ist, sollte sie stabil, zuverlässig und leicht zu reparieren sein, wenn sie beschädigt wird.
quelle
Ich habe alle Antworten auf diese Frage gesammelt und eine Funktion entwickelt, mit der festgestellt werden kann, ob Android auf einem VM / Emulator ausgeführt wird:
Getestet auf Emulator, Genymotion und Bluestacks (1. Oktober 2015).
quelle
Bei der Verwendung der LeapDroid-, Droid4x- oder Andy-Emulatoren funktionierte keiner von ihnen.
Was in allen Fällen funktioniert, ist Folgendes:
quelle
Da die zugrunde liegende Emulations-Engine für Genymotion VirtualBox ist und sich dies in Kürze nicht ändern wird, fand ich den folgenden Code am zuverlässigsten:
quelle
Unabhängig davon, welchen Code Sie für die Emulatorerkennung verwenden, würde ich dringend empfehlen, Komponententests zu schreiben, um alle und Werte abzudecken
Build.FINGERPRINT
, von denen Sie abhängig sind. Hier einige Beispieltests:Build.HARDWARE
Build.MANUFACTURER
... und hier ist unser Code (Debug-Protokolle und Kommentare wurden aus Gründen der Übersichtlichkeit entfernt):
quelle
Eine andere Möglichkeit besteht darin, zu überprüfen, ob Sie sich im Debug- oder Produktionsmodus befinden:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
einfach und zuverlässig.
Nicht ganz die Antwort auf die Frage, aber in den meisten Fällen möchten Sie möglicherweise zwischen Debugging- / Testsitzungen und Lebenssitzungen Ihrer Benutzerbasis unterscheiden.
In meinem Fall habe ich Google Analytics im Debug-Modus auf dryRun () gesetzt, sodass dieser Ansatz für mich völlig in Ordnung ist.
Für fortgeschrittene Benutzer gibt es eine andere Option. Gradle Build-Varianten:
Fügen Sie in der Gradle-Datei Ihrer App eine neue Variante hinzu:
Überprüfen Sie in Ihrem Code den Build-Typ:
Jetzt haben Sie die Möglichkeit, 3 verschiedene Arten Ihrer App zu erstellen.
quelle