web-dev-qa-db-fra.com

android confusion d'ID d'appareil

Si je compose *#*#8255#*#* , J'obtiens mon Android qui commence par Android-35c2acdd...

source source

Si j'utilise Settings.Secure.getString(getContentResolver(), Settings.Secure.Android_ID) le résultat commence par a96b4b27...

Si j'utilise ((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId() Le résultat commence par 3538330...

Quelle est la différence entre ces identifiants? Comment puis-je obtenir le résultat du

*#*#8255#*#* cadran?

43

[~ # ~] imei [~ # ~]

L'IMEI est le ' MAC ' pour le module de téléphonie - l'ID unique que le téléphone utilise lorsqu'il se connecte via GSM/GPRS/HSPDA/etc. Le réseau GSM l'utilise pour acheminer les appels et les données du téléphone sur le réseau GSM jusqu'à la passerelle vers Internet (qui est un réseau IP).

Un module de téléphonie est une puce ou une carte de circuit imprimé qui gère le réseau téléphonique, GSM ou CMDA, et possède souvent un emplacement pour une carte SIM amovible. Certains téléphones ont plus d'un module de téléphonie (téléphones actifs à double ou multi-SIM). Chaque module de téléphonie possède son propre IMEI.

Les fabricants donnent à chaque téléphone (strictement le module de téléphonie) un IMEI unique lors de la fabrication. Cependant, le numéro peut normalement être réécrit si vous avez le bon logiciel. Cela est souvent fait après le vol d'un téléphone pour lui donner une nouvelle identité et un système de blocage de téléphone volé bipass.

L'IMEI peut être obtenu par programme à l'aide de l'API TelephonyManager.getDeviceId () .

Les téléphones CDMA ont un ESN ou MEID qui sont longueurs et formats différents , même s'il est récupéré à l'aide de la même API.

Appareils Android sans modules de téléphonie - par exemple de nombreuses tablettes et appareils TV - n'ont pas d'IMEI. Comme Schlangi commenté, certains appareils qui n'ont pas de module de téléphonie faux l'IMEI, donc la présence d'un IMEI ne garantit pas (toujours) que l'appareil dispose d'une téléphonie module.

Android_ID

L'Android_ID est un autre numéro unique sur le téléphone - il est automatiquement généré par le système d'exploitation lors de son premier démarrage (le faire de cette façon rend beaucoup plus facile pour les fabricants en supprimant une étape de la ligne de production).

L'Android_ID peut (et change), par exemple:

Il est principalement utilisé par les développeurs (par exemple, identifier et se connecter à des appareils à l'aide de adb)

Android_ID peut être utilisé pour identifier un appareil Android compte tenu des mises en garde ci-dessus, ce qui signifie de manière réaliste qu'il identifie de manière unique l'appareil sur des parties importantes de la durée de vie de l'appareil, mais ne peut pas être utilisé.

Notez également qu'il y avait un bug dans Froyo où de nombreux appareils se donnaient le même Android_ID. C'est le bug

Autres identifiants

Il existe un certain nombre d'autres choses qui peuvent être utilisées pour identifier l'appareil:

  • Adresse MAC du module WiFi: WifiManager.getConnectionInfo () -> WifiInfo.getMacAddress () . Cela peut souvent être modifié dans le logiciel, mais généralement est constant pendant la durée de vie de l'appareil. De plus, il ne peut être lu que si le module WiFi est allumé.
  • Adresse MAC du module BlueTooth: BluetoothAdaptor.getAddress () . Comme WiFi MAC, cela peut souvent être modifié dans le logiciel et peut être désactivé lorsque vous en avez besoin
  • Le numéro de téléphone de l'abonné. Cela peut changer si l'utilisateur demande un nouveau numéro à l'opérateur téléphonique ou s'il change de carte SIM. Il est obtenu à partir de TelephonyManager.getLine1Number () . Ceci est uniquement présent pour les appareils téléphoniques Android avec une carte SIM actuelle installée et un service payant avec un opérateur téléphonique).
  • La carte SIM contient son propre numéro d'identification ( IMSI ). Ceci est obtenu à partir de l'API TelephonyManager.getSubscriberId () . Évidemment, la carte SIM peut ne pas être présente à un moment précis, et elle change lorsque la carte SIM est changée - et les utilisateurs peuvent mettre à niveau/remplacer leur carte SIM tout en conservant le même numéro, vous ne pouvez donc pas dire que c'est un à un pour un téléphone ou un utilisateur spécifique.
  • L'IMSI est lié à MSISDN . Cela fonctionne comme l'identification d'un abonnement (votre contrat pour un numéro de téléphone spécifique avec votre opérateur de téléphonie mobile) et donne donc à l'appareil son numéro de téléphone. Le MSISDN peut être associé à plusieurs cartes SIM, et donc à plusieurs téléphones. Il est livré avec toutes les mises en garde pour lire la carte SIM ci-dessus. Cela peut être récupéré avec TelephonyManager.getSimSerialNumber () . Merci Schlangi pour les corrections et ajouts
  • Gingerbread et plus tard a Android.os.Build.SERIAL que de nombreux fabricants ont défini (mais pas tous. Bugger).

Autres notes

Vous avez besoin d'autorisations spécifiques pour accéder à chaque API, donc si vous essayez pour chacune d'entre elles, les autorisations de votre application dans le Google Play Store semblent assez permissives.

Je pense que ce lien explique également toutes les autres options disponibles https://Android-developers.googleblog.com/2011/03/identifying-app-installations.html

81
Andrew Alcock

Trouvé sur le web:

private static final Uri URI = Uri.parse("content://com.google.Android.gsf.gservices");
private static final String ID_KEY = "Android_id";

String getAndroidId(Context ctx) {
    String[] params = { ID_KEY };
    Cursor c = ctx.getContentResolver()
            .query(URI, null, null, params, null);

    if (!c.moveToFirst() || c.getColumnCount() < 2)
        return null;

    try {
        return Long.toHexString(Long.parseLong(c.getString(1)));
    } catch (NumberFormatException e) {
        return null;
    }
}

Ajouter une autorisation:

<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>

Cependant, je doute qu'il s'agisse d'un ID documenté et je serais prudent car cela pourrait ne pas fonctionner si GTalk est mis à jour.

Source: http://blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-Android-id/

Cela vaut également la peine de jeter un œil à: http://www.toxicbakery.com/Android-development/getting-google-auth-sub-tokens-in-your-Android-applications/

8
Vincent Mimoun-Prat

Il existe certaines approches pour obtenir un identifiant unique sur le téléphone Android.

  1. ID Android Il s'agit d'une chaîne hexadécimale de 64 bits qui est générée lors du premier démarrage de l'appareil. Généralement, il ne changera pas, sauf s'il est réinitialisé aux paramètres d'usine.

    Secure.getString (getContentResolver (), Secure.Android_ID);

L'ID Android, considéré comme non fiable car il peut parfois être nul. La documentation indique qu'il "peut changer lors de la réinitialisation d'usine". Cette chaîne peut également être modifiée sur un téléphone rooté.

   String m_szAndroidID = Secure.getString(getContentResolver(), Secure.Android_ID);

Returns: 9774d56d682e549c . No special permissions required.

2. La chaîne d'adresse MAC WLAN est un autre identifiant unique que vous pouvez utiliser comme identifiant de périphérique. Avant de le lire, vous devez vous assurer que votre projet dispose de l'autorisation Android.permission.ACCESS_WIFI_STATE ou que l'adresse MAC WLAN sera nulle.

 WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
 String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked).
WLAN doesn't have to be on, to read this value.

3. La chaîne d'adresse MAC BT, disponible sur les appareils Android avec Bluetooth, peut être lue si votre projet dispose de l'autorisation Android.permission.BLUETOOTH.

    BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
    m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
   String m_szBTMAC = m_BluetoothAdapter.getAddress();

Renvoie: 43: 25: 78: 50: 93: 38. BT n'a pas besoin d'être allumé pour le lire. 4. IMEI uniquement pour les appareils Android avec utilisation du téléphone:

 TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
 String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE

Cela nécessite l'ajout d'une autorisation dans AndroidManifest.xml, et les utilisateurs seront avertis lors de l'installation de votre logiciel: Android.permission.READ_PHONE_STATE. L'IMEI est unique pour votre téléphone et il ressemble à ceci: 359881030314356 (sauf si vous avez un appareil de pré-production avec un IMEI invalide comme 0000000000000). Pour plus d'informations voir ce lien.

5
neeraj t

IMEI

Il y a une exigence obligatoire des organismes de normalisation, que les appareils mobiles pour les réseaux publics puissent être identifiés de manière unique par le numéro IMEI

Il est de la responsabilité du fabricant de définir IMEI. En pratique, les développeurs voient parfois des IMEI comme 000000 ... ou 123456 ... Parfois, des téléphones avec des IMEI identiques vont en production, ce qui bien sûr est un bug qui devrait être corrigé ...

Android_ID

n nombre 64 bits (sous forme de chaîne hexadécimale) qui est généré de manière aléatoire lors du premier démarrage de l'appareil et doit rester constant pendant toute la durée de vie de l'appareil. (La valeur peut changer si une réinitialisation d'usine est effectuée sur l'appareil. )

Il ressemble à Android ne fait pas confiance aux fabricants et fournit un identifiant unique alternatif.

MODIFIER:

Voici ce que j'obtiens (au lieu d'IMEI) et Android appareil qui est pas un téléphone:

$ adb Shell dumpsys iphonesubinfo
Phone Subscriber Info:
  Phone Type = GSM
  Device ID = null
3

Je pense que toutes les informations fournies ci-dessus sont suffisantes pour comprendre les codes.

Pourtant, je pense que vous n'êtes toujours "pas en mesure de voir le résultat de la # # 8255 # # composer "(excuse plz si je me suis trompé quelque part en comprenant cela)

Je suppose que la raison derrière cela est l'un des derniers correctifs de bogues contre le code USSD fabriqué dans Android. (vous pouvez en savoir plus à ce sujet et vérifier si votre appareil figure sur la liste. c'est partout sur le web)

Enfin, si vous voulez simplement obtenir l'ID Android immédiatement, je vous suggère d'utiliser cette application-

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en

1
pragmatic