J'obtiens l'IMEI ID null du telephonymanager. Que faire ?
Y a-t-il une solution de contournement pour cela ?
J'obtiens l'IMEI ID null du telephonymanager. Que faire ?
Y a-t-il une solution de contournement pour cela ?
Vous pouvez changer d'autre façon, j'utilise l'uuid pour remplacer l'id des appareils.
String uniquePseudoID = "35" +
Build.BOARD.length() % 10 +
Build.BRAND.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;
String serial = Build.getRadioVersion();
String uuid = new UUID(uniquePseudoID.hashCode(), serial.hashCode()).toString();
AppLog.d("Device ID",uuid);
Je ne suis pas sûr du numéro IMEI, mais vous pouvez obtenir le simSerialNumber et d'autres informations sur l'opérateur de cette façon.
getSimSerialNumber() nécessite des permissions privilégiées à partir d'Android 10, et les applications tierces ne peuvent pas enregistrer cette permission.
Voir : https://developer.Android.com/about/versions/10/privacy/changes#non-resettable-device-ids
Une solution possible est d'utiliser le TELEPHONY_SUBSCRIPTION_SERVICE d'Android 5.1, pour récupérer le numéro de série de la sim. Voici les étapes à suivre :
Récupérer les détails de la simulation à partir de l'objet d'abonnement.
if ( isPermissionGranted(READ_PHONE_STATE) ) {
String simSerialNo="";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
SubscriptionManager subsManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subsList = subsManager.getActiveSubscriptionInfoList();
if (subsList!=null) {
for (SubscriptionInfo subsInfo : subsList) {
if (subsInfo != null) {
simSerialNo = subsInfo.getIccId();
}
}
}
} else {
TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
simSerialNo = tMgr.getSimSerialNumber();
}
}
Vérifiez si cela vous aide
Si votre application cible Android 10 ou plus, une SecurityException se produit.
Les modules suivants sont concernés...
Build
getSerial()
TelephonyManager
getImei()
getDeviceId()
getMeid()
getSimSerialNumber()
getSubscriberId()
Vous ne pouvez donc pas obtenir de numéro IMEI pour Android 10, vous devez utiliser un autre identifiant unique pour cela, comme Android ID.
Il s'agit d'un numéro hexagonal unique de 64 bits pour le dispositif
private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID) ;
Selon google docs .
Restriction sur les identificateurs de dispositifs non réinitialisables
À partir d'Android 10, les applications doivent disposer de la permission privilégiée READ_PRIVILEGED_PHONE_STATE pour accéder aux identifiants non réinitialisables de l'appareil, qui comprennent l'IMEI et le numéro de série.
Attention : Les applications tierces installées depuis le Google Play Store ne peuvent pas déclarer des permissions privilégiées.
Donc, au lieu de l'imei, vous pouvez obtenir l'ID unique d'Android.
String imei = "";
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
if (telephonyManager != null) {
try {
imei = telephonyManager.getImei();
} catch (Exception e) {
e.printStackTrace();
imei = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID);
}
}
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1010);
}
} else {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
if (telephonyManager != null) {
imei = telephonyManager.getDeviceId();
}
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1010);
}
}
Ciblant Android Q, les applications tierces ne peuvent pas du tout accéder à l'IMEI. La documentation d'Android Q est trompeuse lorsqu'elle affirme que
À partir d'Android Q, les applications doivent disposer de la permission privilégiée READ_PRIVILEGED_PHONE_STATE afin d'accéder aux données non réinitialisables de l'appareil. de l'appareil, qui comprennent l'IMEI et le numéro de série. https://developer.Android.com/preview/privacy/data-identifiers#device-ids
Mais lorsque j'ai essayé de le mettre en œuvre, j'ai reçu cette exception :
java.lang.SecurityException: getDeviceId: The user 10132 does not meet the requirements to access device identifiers.
Quelqu'un a signalé ce problème sur le site de suivi des problèmes de Google, où un Googler a déclaré que ce comportement était prévu et que l'IMEI sur Q+ n'était disponible que pour les applications au niveau du système.
Statut : Won't Fix (Comportement prévu) Ceci fonctionne comme prévu. L'IMEI est un identifiant personnel et n'est pas donné aux applications par principe. politique. Il n'y a pas de solution de contournement.
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.
1 votes
Essayez-vous de le faire sur l'émulateur ?
1 votes
Non. Google Pixel 1. Je me suis inscrit il y a quelques heures et j'ai découvert que mon application ne reçoit pas le numéro IMEI.
1 votes
Je n'ai pas essayé Android Q mais j'ai lu qu'ils limitaient l'accès aux identifiants non réinitialisables des appareils.
1 votes
Lis celui-là : developer.Android.com/preview/privacy/checklist (en anglais)
3 votes
Le fait est que j'utilise l'IMEI pour la détection des fraudes. L'autre solution, comme ANDROID_ID, n'est pas fiable à 100%. J'ai besoin de quelque chose qui est unique à l'appareil afin de mettre l'appareil sur liste noire
0 votes
J'ai aussi besoin d'accéder à l'IMEI du téléphone. J'essaie désespérément de trouver une solution à ce problème.
2 votes
Je crains qu'il n'y ait pas d'alternative pour obtenir l'IMEI avant Android 10. Vous pouvez avoir n'importe quel autre identifiant unique. Cela dépend totalement de votre cas d'utilisation. Si vous voulez suivre les appareils uniques, vous pouvez utiliser ANDROID_ID qui est différent pour chaque nom de paquet à partir d'Android 27 et unique pour chaque appareil en dessous de 27.