web-dev-qa-db-fra.com

Numéro de série unique Android

Je développe une application Android qui cible Android 4.0 (API 14) et les versions ultérieures.

Je recherche un numéro de série unique par appareil et persistant pour toujours (meurt avec l'appareil, ne change pas après les réinitialisations d'usine).

J'ai trouvé de nombreux résultats sur le Web concernant des identifiants uniques pour les appareils Android, mais très peu sur le Android.os.Build.SERIAL number.

Jusqu'ici, j'ai éliminé l'utilisation de Android_ID car elle pourrait changer après les réinitialisations d'usine. J'ai également éliminé l'utilisation duIMEIparce que l'appareil Android pourrait ne pas être un téléphone. Je ne peux pas utiliser le wifi ou le bluetooth MAC ADDRESS car le périphérique ne dispose peut-être pas d'un tel matériel et/ou de telles adresses Mac risquent de ne pas être lisibles si le matériel n'est pas activé (en fonction de ce que j'ai trouvé sur le Web).

Je crois que je pourrais aller pour le numéro de série du périphérique Android.

Il est facilement accessible via Android.os.Build.SERIAL (car il est ajouté au niveau 9 de l’API et ne nécessite aucune autorisation supplémentaire).

Mes questions sont:

  • Étant donné que mon application cible Android 4.0 (API 14) et les versions ultérieures, le Android.os.Build.SERIAL le numéro des appareils Android est-il unique pour chaque appareil?

  • Actuellement, la documentation de Android.os.Build.SERIAL indique: Un numéro de série du matériel, s'il est disponible. Alphanumérique uniquement, insensible à la casse. Cela signifie-t-il que le numéro de série peut ne pas être disponible?

  • Quelle pourrait être une autre alternative qui répond aux conditions mentionnées ci-dessus?

50
Leeeeeeelo

Étant donné que mon application cible les versions Android 4.0 (API 14) et les versions ultérieures, le numéro Android.os.Build.SERIAL des périphériques Android est-il unique pour chaque périphérique?

Selon cet utile article dans le blog Android pour développeurs, Android.os.Build.SERIAL devrait être unique s'il est disponible. De l'article:

Les appareils sans téléphonie sont tenus de signaler ici un identifiant d'appareil unique. certains téléphones peuvent aussi le faire.

Cela signifie-t-il que le numéro de série peut ne pas être disponible?

Correct, il peut ne pas être disponible. Notez qu'ils disent "Les appareils sans téléphonie sont nécessaires ..." , seuls les appareils sans "téléphonie" (comme les tablettes wifi uniquement) sont tenus de fournir un numéro SERIAL, bien que certains téléphones le soient encore (comme le Nexus 4).

La documentation manque assurément à ce sujet, mais d'après le libellé, il est possible que seuls les "appareils sans téléphonie" soient tenus de soumettre un identifiant unique, alors que les téléphones qui le soumettent peuvent ne pas être uniques.

Quelle pourrait être une autre alternative qui répond aux conditions mentionnées ci-dessus?

Pour votre situation, je pense que votre meilleur choix est de vérifier d’abord un deviceId (IMEI, ou pas) et si deviceId n’existe pas, vous vous rabattez sur Android.os.Build.SERIAL (car est probablement une tablette) comme suit:

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return Android.os.Build.SERIAL;
    }
}

N'oubliez pas d'utiliser deviceId pour obtenir l'autorisation Android.permission.READ_PHONE_STATE.

Donc puisque le minSDK de votre application a 14 ans, vous pouvez utiliser le champ Android.os.Build.SERIAL en toute sécurité. Et si nous supposons que les appareils sans téléphonie fournissent toujours des identifiants uniques dans SERIAL, alors je pense que ce serait un pari sûr de toujours avoir un identifiant d'appareil unique (sauf les bugs bien sûr).

54
Tony Chan

J'utilise personnellement Secure.Android_ID & Build.SERIAL pour identifier un téléphone:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.Android_ID) + Build.SERIAL;

Ils peuvent avoir le même Android_ID, ils peuvent ne pas avoir de SERIAL. Mais la chance des deux est faible.

9
Kai Wang

Vous semblez avoir assez bien résumé la situation.

Le numéro de série est destiné à être unique pour chaque appareil, mais (il s’agit d’Android), il existe bien sûr des bogues qui créent des exceptions, par exemple: __. https://code.google.com/p/Android/issues/detail ? id = 35193

Comme vous l'avez fait remarquer, la documentation suggère qu'il s'agisse d'un numéro de série de matériel, mais la façon dont il est libellé suggère que vous ne devriez pas compter sur cela. Et ne confondez pas cela avec le numéro de série réel du périphérique, c’est-à-dire le numéro de série imprimé au dos ou sur la boîte. De plus, je pense qu'il est beaucoup moins utilisé qu'Android_id. Il pourrait donc y avoir des problèmes qui ne sont pas signalés.

J'ai souvent vu que Android_id était basé sur le numéro de série, mais je pense que ce n'est pas vrai. J'ai récemment observé que, sur une tablette dotée de la nouvelle fonctionnalité multi-utilisateur, chaque compte utilisateur obtenait son propre Android_id, mais le Le numéro de série est le même pour les deux.

Autant que je sache, «une autre alternative» n'existe pas: votre liste est complète. Le numéro de série est ce qui se rapproche le plus de ce que vous recherchez, à moins que vous ne soyez prêt à dépendre d'autorisations Wi-Fi ou Bluetooth.

4
Tom

J'obtiens généralement des identifiants uniques en faisant un hachage SHA1 d'une chaîne unique (le nom de l'entreprise en général) + imei (si vous ne possédez pas d'imei, adresse mac [wifi, bluetooth, etc.]). Cela me donne des identifiants uniques qui se ressemblent, ont tendance à être uniques par périphérique (pas parfait si le MAC est changé/falsifié).

0
Ryan Schultz