Je dois utiliser un identifiant unique pour une application Android et j'ai pensé que le numéro de série de l'appareil serait un bon candidat. Comment récupérer le numéro de série d'un appareil Android dans mon application?
115
Je dois utiliser un identifiant unique pour une application Android et j'ai pensé que le numéro de série de l'appareil serait un bon candidat. Comment récupérer le numéro de série d'un appareil Android dans mon application?
Réponses:
getSystemService est une méthode de la classe Activity. getDeviceID () renverra le MDN ou MEID de l'appareil en fonction de la radio utilisée par le téléphone (GSM ou CDMA).
Chaque appareil DOIT renvoyer une valeur unique ici (en supposant qu'il s'agisse d'un téléphone). Cela devrait fonctionner pour tout appareil Android avec un slot SIM ou une radio CDMA. Vous êtes seul avec ce micro-ondes alimenté par Android ;-)
la source
Comme le mentionne Dave Webb, le blog des développeurs Android contient un article qui couvre ce sujet.
J'ai parlé avec quelqu'un de Google pour obtenir des éclaircissements supplémentaires sur quelques éléments. Voici ce que j'ai découvert qui n'est PAS mentionné dans l'article de blog susmentionné:
Sur la base des recommandations de Google, j'ai implémenté une classe qui générera un UUID unique pour chaque appareil, en utilisant ANDROID_ID comme graine le cas échéant, en recourant à TelephonyManager.getDeviceId () si nécessaire, et en cas d'échec, en recourant à un UUID unique généré aléatoirement. qui est conservé lors des redémarrages de l'application (mais pas des réinstallations d'application).
la source
Ce code renvoie le numéro de série de l'appareil à l'aide d'une API Android masquée.
la source
Cependant, il n'est pas garanti que l'ID Android sera un identifiant unique.
la source
getContentResolver
c'est de retournull
. Cependant, cela peut valoir la peine d'ouvrir une question et de publier votre code.Il y a un excellent article sur le blog du développeur Android qui en parle .
Il recommande
TelephonyManager.getDeviceId()
de ne pas l' utiliser car il ne fonctionne pas sur les appareils Android qui ne sont pas des téléphones tels que les tablettes, il nécessite l'READ_PHONE_STATE
autorisation et ne fonctionne pas de manière fiable sur tous les téléphones.Au lieu de cela, vous pouvez utiliser l'un des éléments suivants:
Le message traite des avantages et des inconvénients de chacun et il vaut la peine d'être lu afin que vous puissiez déterminer lequel serait le mieux pour votre utilisation.
la source
Pour un numéro simple qui est unique à l'appareil et constant pour sa durée de vie (sauf réinitialisation d'usine ou piratage), utilisez Settings.Secure.ANDROID_ID .
Pour utiliser le numéro de série de l'appareil (celui indiqué dans «Paramètres système / À propos / État») si disponible et revenir à l'identifiant Android:
la source
L'IMEI est bon mais ne fonctionne que sur les appareils Android avec téléphone. Vous devriez également envisager la prise en charge des tablettes ou d'autres appareils Android, qui n'ont pas de téléphone.
Vous avez des alternatives comme: Construisez des membres de classe, BT MAC, WLAN MAC, ou encore mieux - une combinaison de tout cela.
J'ai expliqué ces détails dans un article sur mon blog, voir: http://www.pocketmagic.net/?p=1662
la source
Comme aucune réponse ici ne mentionne un ID parfait et infaillible qui est à la fois PERSISTANT grâce aux mises à jour du système et existe dans TOUS les appareils (principalement en raison du fait qu'il n'y a pas de solution individuelle de Google), j'ai décidé de publier une méthode qui est la meilleure chose suivante en combinant deux des identificateurs disponibles, et une vérification pour choisir entre eux au moment de l'exécution.
Avant le code, 3 faits:
TelephonyManager.getDeviceId()
(akaIMEI) ne fonctionnera pas bien ou pas du tout pour les appareils non GSM, 3G, LTE, etc., mais renverra toujours un identifiant unique lorsque le matériel associé est présent , même lorsqu'aucune carte SIM n'est insérée ou même lorsqu'aucun emplacement SIM n'existe ( certains OEM l'ont fait).Depuis Gingerbread (Android 2.3)
android.os.Build.SERIAL
doit exister sur tout appareil qui ne fournit pas IMEI , c'est-à-dire qui n'a pas le matériel susmentionné, conformément à la politique Android.En raison du fait (2.), au moins un de ces deux identifiants uniques sera TOUJOURS présent , et SERIAL peut être présent en même temps que IMEI.
Remarque: les faits (1.) et (2.) sont basés sur les déclarations de Google
SOLUTION
Avec les faits ci-dessus, on peut toujours avoir un identifiant unique en vérifiant s'il existe du matériel lié à IMEI, et revenir à SERIAL quand ce n'est pas le cas, car on ne peut pas vérifier si le SERIAL existant est valide. La classe statique suivante présente 2 méthodes pour vérifier cette présence et utiliser IMEI ou SERIAL:
Je conseillerais sur l'utilisation
getCleartextID_HARDCHECK
. Si le reflet ne colle pas à votre environnement, utilisez legetCleartextID_SIMCHECK
plutôt méthode, mais prenez en considération qu'elle doit être adaptée à vos besoins spécifiques de présence SIM.PS : Veuillez noter que les OEM ont réussi à écarter SERIAL contre la politique de Google (plusieurs appareils avec le même SERIAL), et Google, comme indiqué, il y a au moins un cas connu dans un grand OEM (non divulgué et je ne sais pas quelle marque c'est non plus, je suppose Samsung).
Avertissement : Cela répond à la question initiale d'obtenir un ID d'appareil unique, mais l'OP a introduit une ambiguïté en déclarant qu'il a besoin d'un ID unique pour une application. Même si pour de tels scénarios, Android_ID serait meilleur, il NE FONCTIONNE PAS après, par exemple, une sauvegarde Titanium d'une application via 2 installations de ROM différentes (peut même être la même ROM). Ma solution maintient une persistance indépendante d'un flash ou d'une réinitialisation d'usine, et n'échouera que lorsque la falsification IMEI ou SERIAL se produit par le biais de hacks / mods matériels.
la source
Il y a des problèmes avec toutes les approches ci-dessus. Chez Google i / o, Reto Meier a publié une réponse solide sur la façon d'aborder cela, qui devrait répondre aux besoins de la plupart des développeurs pour suivre les utilisateurs à travers les installations.
Cette approche vous donnera un identifiant utilisateur anonyme et sécurisé qui sera persistant pour l'utilisateur sur différents appareils (y compris les tablettes, en fonction du compte Google principal) et entre les installations sur le même appareil. L'approche de base consiste à générer un ID utilisateur aléatoire et à le stocker dans les préférences partagées des applications. Vous utilisez ensuite l'agent de sauvegarde de Google pour stocker les préférences partagées liées au compte Google dans le cloud.
Passons en revue l'approche complète. Nous devons d'abord créer une sauvegarde de nos SharedPreferences à l'aide du service de sauvegarde Android. Commencez par enregistrer votre application via ce lien: http://developer.android.com/google/backup/signup.html
Google vous donnera une clé de service de sauvegarde que vous devez ajouter au manifeste. Vous devez également indiquer à l'application d'utiliser le BackupAgent comme suit:
Ensuite, vous devez créer l'agent de sauvegarde et lui dire d'utiliser l'agent d'assistance pour les préférences partagées:
Pour terminer la sauvegarde, vous devez créer une instance de BackupManager dans votre activité principale:
Enfin, créez un ID utilisateur, s'il n'existe pas déjà, et stockez-le dans les SharedPreferences:
Cet User_ID sera désormais persistant dans toutes les installations, même si l'utilisateur change de périphérique.
Pour plus d'informations sur cette approche, consultez la présentation de Reto ici http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html
Et pour plus de détails sur la mise en œuvre de l'agent de sauvegarde, consultez le site des développeurs ici: http://developer.android.com/guide/topics/data/backup.html Je recommande particulièrement la section en bas sur les tests comme le fait la sauvegarde ne se produit pas instantanément et donc pour tester, vous devez forcer la sauvegarde.
la source
Une autre façon consiste à utiliser / sys / class / android_usb / android0 / iSerial dans une application sans aucune autorisation.
Pour ce faire en java, il suffit d'utiliser un FileInputStream pour ouvrir le fichier iSerial et lire les caractères. Assurez-vous simplement de l'envelopper dans un gestionnaire d'exceptions, car tous les périphériques n'ont pas ce fichier.
Au moins les appareils suivants sont connus pour avoir ce fichier lisible par tout le monde:
Vous pouvez également voir mon article de blog ici: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html où je discute des autres fichiers disponibles pour info.
la source
Comme le dit @haserman:
Mais il est nécessaire d'inclure l'autorisation dans le fichier manifeste:
la source
ID d'appareil unique de l'appareil Android OS sous forme de chaîne.
mais je recommande vivement cette méthode suggérée par Google:
Identification des installations d'application
la source
Build.SERIAL
est le moyen le plus simple, mais pas entièrement fiable, car il peut être vide ou parfois renvoyer une valeur différente ( preuve 1 , preuve 2 ) que ce que vous pouvez voir dans les paramètres de votre appareil.Il existe plusieurs façons d'obtenir ce nombre en fonction du fabricant de l'appareil et de la version d'Android, j'ai donc décidé de compiler toutes les solutions possibles que je pouvais trouver en un seul élément . En voici une version simplifiée:
la source
Je sais que cette question est ancienne mais cela peut être fait en une seule ligne de code
String deviceID = Build.SERIAL;
la source
J'ai trouvé que l'exemple de classe posté par @emmby ci-dessus était un excellent point de départ. Mais il a quelques défauts, comme mentionné par d'autres affiches. Le principal est qu'il persiste inutilement l'UUID dans un fichier XML et le récupère par la suite toujours à partir de ce fichier. Cela ouvre la classe à un piratage facile: toute personne possédant un téléphone enraciné peut modifier le fichier XML pour se donner un nouvel UUID.
J'ai mis à jour le code pour qu'il ne persiste en XML que si cela est absolument nécessaire (c'est-à-dire lors de l'utilisation d'un UUID généré aléatoirement) et re-factorisé la logique selon la réponse de @Brill Pappin:
la source
Oui. Il s'agit d'un numéro de série matériel du périphérique et il est unique. Ainsi, au niveau de l'API 2.3 et supérieur, vous pouvez utiliser android.os.Build.ANDROID_ID pour l'obtenir. Pour les niveaux d'API inférieurs à 2.3, utilisez TelephonyManager.getDeviceID () .
vous pouvez lire ceci http://android-developers.blogspot.in/2011/03/identifying-app-installations.html
la source