Je voudrais que mon code s'exécute légèrement différemment lors de l'exécution sur l'émulateur que lors de l'exécution sur un appareil. ( Par exemple , utiliser 10.0.2.2 au lieu d'une URL publique pour s'exécuter automatiquement sur un serveur de développement.) Quelle est la meilleure façon de détecter lorsqu'une application Android s'exécute dans l'émulateur?
android
android-emulator
Joe Ludwig
la source
la source
android.os.Build
.Réponses:
Que diriez-vous de cette solution:
Notez que certains émulateurs simulent des spécifications exactes de vrais appareils, il peut donc être impossible de les détecter.
Voici un petit extrait que vous pouvez créer dans l'APK pour montrer diverses choses à ce sujet, afin que vous puissiez ajouter vos propres règles:
la source
Un sems commun à être
Build.FINGERPRINT.contains("generic")
la source
FINGERPRINT
valeur.Eh bien, l'ID Android ne fonctionne pas pour moi, j'utilise actuellement:
la source
Sur la base d'indices provenant d'autres réponses, c'est probablement le moyen le plus robuste:
isEmulator = "goldfish".equals(Build.HARDWARE)
la source
isEmulator = Build.HARDWARE.contains("golfdish")
Google utilise ce code dans le plugin d'informations sur l' appareil de Flutter pour déterminer si l'appareil est un émulateur:
la source
Que diriez-vous de quelque chose comme le code ci-dessous pour savoir si votre application a été signée avec la clé de débogage? il ne détecte pas l'émulateur, mais cela pourrait fonctionner pour votre objectif?
la source
BuildConfig.DEBUG
.Ce code fonctionne pour moi
Dans le cas où cet appareil ne possède pas de carte SIM, il retape la chaîne vide: ""
Étant donné que l'émulateur Android répète toujours "Android" en tant qu'opérateur réseau, j'utilise le code ci-dessus.
la source
J'ai essayé plusieurs techniques, mais j'ai opté pour une version légèrement révisée de la vérification du Build.PRODUCT comme ci-dessous. Cela semble varier un peu d'émulateur en émulateur, c'est pourquoi j'ai les 3 contrôles que j'ai actuellement. Je suppose que j'aurais pu vérifier si product.contains ("sdk") mais j'ai pensé que la vérification ci-dessous était un peu plus sûre.
Pour info - j'ai trouvé que mon Kindle Fire avait Build.BRAND = "générique", et certains des émulateurs n'avaient pas "Android" pour l'opérateur réseau.
la source
Les deux éléments suivants sont définis sur "google_sdk":
Il devrait donc suffire d'utiliser l'une des lignes suivantes.
ou
la source
sdk_x86
.Je cherche juste
_sdk
,_sdk_
ousdk_
, ou même simplement jesdk
participe àBuild.PRODUCT
:la source
contains("sdk")
? La seule différence (en plus d'être plus rapide) est quematches(".*_?sdk_?.*")
, s'il y a un caractère avant ou après sdk, ce doit être un trait de soulignement «_», ce qui n'est pas si important à vérifier.Je n'ai jamais trouvé un bon moyen de savoir si vous êtes dans l'émulateur.
mais si vous avez juste besoin de détecter si vous êtes dans un environnement de développement, vous pouvez le faire:
J'espère que cette aide ....
la source
utilisez cette fonction:
la source
Je ne sais pas s'il existe de meilleures façons de détecter l'ému, mais l'émulateur aura le fichier
init.goldfish.rc
dans le répertoire racine.Il s'agit du script de démarrage spécifique à l'émulateur, et il ne devrait pas être présent sur une version non émulateur.
la source
Voici ma solution (cela ne fonctionne que si vous exécutez un serveur Web sur votre machine de débogage): J'ai créé une tâche en arrière-plan qui démarre au démarrage de l'application. Il recherche http://10.0.2.2 et s'il existe, il change un paramètre global (IsDebug) en true. C'est un moyen silencieux de savoir où vous courez.
de l'activité principale surCréer:
la source
De la batterie, l'émulateur: la source d'alimentation est toujours un chargeur CA. La température est toujours 0.
Et vous pouvez utiliser
Build.HOST
pour enregistrer la valeur d'hôte, un émulateur différent a une valeur d'hôte différente.la source
J'ai trouvé le nouvel émulateur
Build.HARDWARE = "ranchu"
.Référence: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
Et j'ai aussi trouvé la façon officielle d'Android de vérifier si l'émulateur ou non. Je pense que c'est une bonne référence pour nous.
Nous devons
ScreenShapeHelper.IS_EMULATOR
vérifier si l'émulateur.Nous devons
Build.IS_EMULATOR
vérifier si l'émulateur.La façon dont le fonctionnaire vérifie si l'émulateur n'est pas nouveau, et peut-être pas assez, les réponses ci-dessus sont également mentionnées.
Mais cela peut nous montrer que l'officiel fournira le moyen à l'officiel de vérifier si l'émulateur ou non.
En utilisant les méthodes mentionnées ci-dessus, nous pouvons également utiliser les deux méthodes pour vérifier si l'émulateur.
Comment accéder au
com.android.internal
package et@hide
et attendez le SDK ouvert officiel.
la source
Une autre option serait d'examiner la propriété ro.hardware et de voir si elle est définie sur poisson rouge. Malheureusement, il ne semble pas y avoir de moyen facile de le faire à partir de Java, mais c'est trivial à partir de C en utilisant property_get () .
la source
La solution suggérée ci-dessus pour vérifier le
ANDROID_ID
fonctionnement pour moi jusqu'à ce que je mette à jour aujourd'hui les derniers outils SDK publiés avec Android 2.2.Par conséquent, je suis actuellement passé à la solution suivante qui fonctionne jusqu'à présent avec l'inconvénient cependant que vous devez mettre l'autorisation de lecture PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
)la source
Toutes les réponses en une seule méthode
la source
init.goldfish.rc
n'existe que dans les émulateurs; c'est en outre une bonne vérification à venir en plus des détails de construction.Ma recommandation:
essayez ceci depuis github.
Émulateur Android facile à détecter
Comment utiliser avec un exemple:
la source
vous pouvez vérifier l'IMEI #, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
si je me souviens sur l'émulateur ce retour 0. cependant, il n'y a aucune documentation que je puisse trouver qui garantit cela. bien que l'émulateur ne retourne pas toujours 0, il semble assez sûr qu'un téléphone enregistré ne retournera pas 0. ce qui se passerait sur un appareil Android non-téléphone, ou un sans carte SIM installée ou un qui n'est pas actuellement enregistré sur le réseau?
semble que ce serait une mauvaise idée de dépendre de ça.
cela signifie également que vous devez demander la permission de lire l'état du téléphone, ce qui est mauvais si vous ne l'avez pas déjà demandé pour autre chose.
sinon, il y a toujours quelque chose à retourner avant de finalement générer votre application signée.
la source
0
sur une tablette Android ou sur un téléphone sans carte SIM.Cela devrait retourner vrai si l'application s'exécute sur un émulateur.
Ce qu'il faut faire attention, ce n'est pas détecter tous les émulateurs car il n'y a que plusieurs émulateurs différents. C'est facile à vérifier. Nous devons nous assurer que les appareils réels ne sont pas détectés en tant qu'émulateur.
J'ai utilisé l'application appelée " Android Device Info Share " pour vérifier cela.
Sur cette application, vous pouvez voir différents types d'informations sur de nombreux appareils (probablement la plupart des appareils dans le monde; si l'appareil que vous utilisez est absent de la liste, il sera ajouté automatiquement).
la source
En vérifiant les réponses, aucun d'entre eux n'a fonctionné lors de l'utilisation d'émulateurs LeapDroid, Droid4x ou Andy,
Ce qui fonctionne pour tous les cas est le suivant:
la source
En fait, ANDROID_ID sur 2.2 est toujours égal à 9774D56D682E549C (selon ce fil + mes propres expériences).
Donc, vous pouvez vérifier quelque chose comme ceci:
Pas le plus joli, mais ça fait l'affaire.
la source
Ça marche pour moi
la source
Mettez un fichier dans le système de fichiers de l'émulateur; puisque le fichier n'existera pas sur le vrai appareil, celui-ci devrait être stable, fiable et facile à réparer lorsqu'il se casse.
la source
J'ai rassemblé toutes les réponses à cette question et trouvé une fonction pour détecter si Android fonctionne sur un vm / émulateur:
Testé sur Emulator, Genymotion et Bluestacks (1er octobre 2015).
la source
Quel que soit le code que vous utilisez pour effectuer la détection d'émulateur, je vous recommande fortement d'écrire des tests unitaires pour couvrir tous les
Build.FINGERPRINT
,Build.HARDWARE
et lesBuild.MANUFACTURER
valeurs dont vous dépendez. Voici quelques exemples de tests:... et voici notre code (journaux de débogage et commentaires supprimés pour plus de concision):
la source
Étant donné que le moteur d'émulation sous-jacent pour Genymotion est VirtualBox et que cela ne changera pas de sitôt, j'ai trouvé le code suivant le plus fiable:
la source
Une autre option consiste à vérifier si vous êtes en mode débogage ou en mode production:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
simple et fiable.
Pas totalement la réponse à la question mais dans la plupart des cas, vous voudrez peut-être faire la distinction entre les sessions de débogage / test et les sessions de vie de votre base d'utilisateurs.
Dans mon cas, j'ai défini google analytics sur dryRun () en mode débogage, donc cette approche fonctionne parfaitement pour moi.
Pour les utilisateurs plus avancés, il existe une autre option. variantes de construction gradle:
dans le fichier gradle de votre application, ajoutez une nouvelle variante:
Dans votre code, vérifiez le type de build:
Vous avez maintenant la possibilité de créer 3 types différents de votre application.
la source