52 votes

ID unique de l'appareil Android

Je veux un identifiant unique pour l'appareil Android. J'ai essayé avec le code suivant

String ts = Context.TELEPHONY_SERVICE;
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts);

Cependant, je sais que cela ne fonctionne que pour les téléphones.

Que se passe-t-il si mon application est exécutée sur un ordinateur portable, un netbook ou un autre type d'appareil ? Comment puis-je obtenir un identifiant unique dans ce cas ?

2 votes

@Mudassir : Donc, en gros, vous voulez quelque chose qui est "gravé dans le marbre", "codé en dur", qui ne changera jamais et qui est fiable à 100 % ? Intel a essayé... lisez ceci schneier.com/essay-187.html

0 votes

@MisterSquonk Je veux quelque chose de ce genre. J'aime ce qui est "gravé dans la pierre" :-)

0 votes

@Mudassir : Et bien bonne chance pour trouver ça mais je serais surpris que vous puissiez le trouver. Tout au plus, je travaillerais sur le principe de la chose qui est la moins susceptible d'être changée / piratée ou autre pour l'utiliser comme base pour quelque chose qui est aussi "unique" que possible. Après cela, essayez d'écrire du code pour compenser tout problème en cours de route.

45voto

hungr Points 1060

Il existe trois types d'identifiants sur les téléphones Android.

  1. IMEI

  2. IMSI

    String ts = Context.TELEPHONY_SERVICE;
    TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts);
    String imsi = mTelephonyMgr.getSubscriberId();
    String imei = mTelephonyMgr.getDeviceId();
  3. ID Android Il s'agit d'une chaîne hexagonale de 64 bits générée lors du premier démarrage de l'appareil. En général, il ne sera pas modifié, sauf en cas de réinitialisation en usine.

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

3 votes

Mise à jour 3 : String unique_id = Android.provider.Settings.Secure.getString(getContentResolver(), Android.provider.Settings.Secure.ANDROID_ID) ; Ref : developer.Android.com/reference/Android/provider/

24voto

Sreedev R Points 3675
Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Cela ne fonctionnera pas pour tous les appareils.

Certains des appareils Android a un problème Certains appareils renvoie null lorsque nous essayons d'obtenir le Device ID.The seule façon de résoudre ce problème est de faire un pseudodeviceID qui doit être généré par nous-mêmes.This fonction va générer un appareil unique ID pour vous.You peut faire des changements à cette fonction que vous avez besoin.Me too lutté beaucoup pour résoudre ce problème.

public String getDeviceID() {

/*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest");
return Return_DeviceID;*/

TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String m_szImei = TelephonyMgr.getDeviceId(); // Requires
// READ_PHONE_STATE

// 2 compute DEVICE ID
String m_szDevIDShort = "35"
+ // we make this look like a valid IMEI
Build.BOARD.length() % 10 + Build.BRAND.length() % 10
+ Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10
+ Build.DISPLAY.length() % 10 + Build.HOST.length() % 10
+ Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10
+ Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10
+ Build.TAGS.length() % 10 + Build.TYPE.length() % 10
+ Build.USER.length() % 10; // 13 digits
// 3 android ID - unreliable
String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID);
// 4 wifi manager, read MAC address - requires
// android.permission.ACCESS_WIFI_STATE or comes as null
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String m_szWLANMAC = wm.getConnectionInfo().getMacAddress();
// 5 Bluetooth MAC address android.permission.BLUETOOTH required
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter
m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String m_szBTMAC = m_BluetoothAdapter.getAddress();
System.out.println("m_szBTMAC "+m_szBTMAC);

// 6 SUM THE IDs
String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC;
System.out.println("m_szLongID "+m_szLongID);
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
                }
m.update(m_szLongID.getBytes(), 0, m_szLongID.length());
byte p_md5Data[] = m.digest();

String m_szUniqueID = new String();
for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper
// padding)
if (b <= 0xF)
m_szUniqueID += "0";
// add number to string
m_szUniqueID += Integer.toHexString(b);
}
m_szUniqueID = m_szUniqueID.toUpperCase();

Log.i("-------------DeviceID------------", m_szUniqueID);
Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID);

return m_szUniqueID;

}

0 votes

Si vous avez trouvé la bonne réponse, acceptez la réponse...heureux de vous aider:-)

0 votes

L'ID généré est toujours le même, même après le redémarrage de l'appareil ?

21voto

Squonk Points 28943

Regardez la constante ANDROID_ID sur android.provider.Secure.Settings pour voir si ça aide.

J'ajoute quelques liens utiles provenant de la documentation officielle ;

0 votes

0 votes

Il peut être modifié lorsque le téléphone est réinitialisé aux paramètres d'usine. Voir le lien dans le commentaire précédent.

1 votes

@Mudassir : La question dit bien "Que se passe-t-il si mon application est exécutée sur un ordinateur portable, un netbook ou un autre type d'appareil ? Comment puis-je obtenir un identifiant unique dans ce cas ?"

8voto

Kevin Points 4235

Pour obtenir des instructions détaillées sur la manière d'obtenir un identifiant unique pour chaque appareil Android à partir duquel votre application est installée, consultez cette publication officielle de l'Android Developers Blog :

http://Android-developers.blogspot.com/2011/03/identifying-app-installations.html

Il semble que la meilleure solution consiste à en créer un vous-même lors de l'installation, puis à le lire lorsque l'application est relancée.

Personnellement, je trouve cela acceptable mais pas idéal. Aucun identifiant fourni par Android ne fonctionne dans tous les cas, car la plupart dépendent de l'état des radios du téléphone (wifi allumé/éteint, cellulaire allumé/éteint, bluetooth allumé/éteint). Les autres comme Settings.Secure.ANDROID_ID doivent être implémentés par le fabricant et ne sont pas garantis d'être uniques.

Voici un exemple d'écriture de données dans un fichier INSTALLATION qui sera stocké avec toutes les autres données enregistrées localement par l'application.

public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) {
        if (sID == null) {  
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}

0 votes

Le blog dit "Pour la grande majorité des applications, la nécessité est d'identifier une installation particulière, pas un appareil physique" mais l'identifiant créé par le code ci-dessus n'est pas fiable car si l'utilisateur efface les données de l'application, l'identifiant de l'appareil est supprimé et il crée un nouvel identifiant. J'ai testé 10 fois et à chaque fois il crée un nouvel identifiant :(

6voto

Greg Sansom Points 9059

Utilisez un Adresse MAC :

Une adresse MAC (Media Access Control) est un identifiant unique attribué aux interfaces réseau

Tout appareil connecté à un réseau est assuré d'avoir une adresse MAC, et vous pouvez la trouver sur Android en allant dans Paramètres > À propos du téléphone > État.

Vous devriez être en mesure d'obtenir l'adresse Mac Bluetooth à l'aide de la fonction API Bluetooth .

0 votes

Je ne sais pas si Android est immunisé mais les adresses MAC peuvent être falsifiées sur de nombreux systèmes.

0 votes

Est-il disponible sur les netbooks ou les tablettes ? Comment puis-je l'obtenir de manière programmatique ?

2 votes

Oui, le MAC (ou du moins son rapport local) peut être remplacé sur n'importe quel appareil qui est enraciné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X