Comment accéder par programme à la valeur indiquée dans l'image ci-dessous?
Il s'agit du numéro de série du matériel. Pour y accéder sur
Android 8 et versions ultérieures (> = SDK 26) utilisez Android.os.Build.getSerial()
qui nécessite la permission dangereuse READ_PHONE_STATE . En utilisant Android.os.Build.SERIAL
renvoie Android.os.Build.UNknown .
Android 7.1 et versions antérieures (<= SDK 25) et versions antérieures Android.os.Build.SERIAL
renvoie une série valide.
C'est unique pour n'importe quel appareil. Si vous cherchez des possibilités pour obtenir/utiliser un identifiant d'appareil unique, vous devriez lire ici .
Pour une solution impliquant la réflexion sans nécessiter d'autorisation, voir cette réponse .
Jusqu'à Android 7.1 vous l'obtiendrez avec:
Build.SERIAL
Sur Android 8 (SDK 26) et supérieur, ce champ renverra UNKNOWN
et doit être accessible avec:
Build.getSerial()
qui nécessite la permission dangereuseAndroid.permission.READ_PHONE_STATE
.
Puisque Android Q en utilisant Build.getSerial()
devient un peu plus compliqué en exigeant:
Android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
(Qui ne peut être acquis que par les applications système), ou pour que le package appelant soit le appareil ou profil propriétaire et avoir l'autorisation READ_PHONE_STATE
. Cela signifie que la plupart des applications ne pourront pas utiliser cette fonctionnalité. Voir Annonce Android Q de Google.
Si vous avez juste besoin d'un identifiant unique, il est préférable d'éviter d'utiliser des identifiants matériels, car Google essaie continuellement de rendre l'accès plus difficile pour des raisons de confidentialité. Vous pouvez simplement générer une UUID.randomUUID().toString();
et l'enregistrer la première fois qu'elle doit être accessible, par ex. préférences partagées. Vous pouvez également utiliser Android_ID
qui est une chaîne hexadécimale de 8 octets unique à l'appareil, à l'utilisateur et (uniquement à l'installation de l'application Android 8+)). Pour plus d'informations sur ce sujet, voir Meilleures pratiques pour les identificateurs uniques .
Build.SERIAL
peut être vide ou renvoie parfois une valeur différente ( épreuve 1 , épreuve 2 ) que ce que vous pouvez voir dans les paramètres de votre appareil.
Si vous voulez une solution plus complète et robuste, j'ai compilé toutes les solutions possibles que j'ai pu trouver en un seul Gist . En voici une version simplifiée:
public static String getSerialNumber() {
String serialNumber;
try {
Class<?> c = Class.forName("Android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
serialNumber = (String) get.invoke(c, "gsm.sn1");
if (serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ril.serialnumber");
if (serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "ro.serialno");
if (serialNumber.equals(""))
serialNumber = (String) get.invoke(c, "sys.serialnumber");
if (serialNumber.equals(""))
serialNumber = Build.SERIAL;
// If none of the methods above worked
if (serialNumber.equals(""))
serialNumber = null;
} catch (Exception e) {
e.printStackTrace();
serialNumber = null;
}
return serialNumber;
}
J'essaie de mettre à jour Gist régulièrement chaque fois que je peux tester sur un nouvel appareil ou Android. Les contributions sont également les bienvenues.