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 ?
Android Q a restreint l'accès à l'IMEI et au numéro de série. Il n'est disponible que pour les plateformes et les applications avec une autorisation spéciale de l'opérateur. De même, l'autorisation READ_PRIVILEGED_PHONE_STATE n'est pas disponible pour les applications ne faisant pas partie de la plateforme.
Si vous essayez d'y accéder, l'exception suivante se produit
java.lang.SecurityException: getImeiForSlot: The user 10180 does not meet the requirements to access device identifiers.
Veuillez consulter la documentation : https://developer.Android.com/preview/privacy/data-identifiers#device-ids
Je suis en retard pour poster ma réponse. Je crois toujours que ma réponse aidera quelqu'un. Android 10 a restreint l'accès du développeur au numéro IMEI.
Vous pouvez avoir une solution alternative en obtenant Software ID. Vous pouvez utiliser l'ID du logiciel comme un identifiant unique. Veuillez trouver ci-dessous le code que j'utilise dans l'application.
public static String getDeviceId(Context context) {
String deviceId;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
deviceId = Settings.Secure.getString(
context.getContentResolver(),
Settings.Secure.ANDROID_ID);
} else {
final TelephonyManager mTelephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
deviceId = mTelephony.getDeviceId();
} else {
deviceId = Settings.Secure.getString(
context.getContentResolver(),
Settings.Secure.ANDROID_ID);
}
}
return deviceId;
}
Cela ne fonctionnerait pas avec Android Q. Les applications tierces ne peuvent pas utiliser l'IMEI, le numéro de série d'un téléphone ou d'autres identifiants d'appareils non réinitialisables.
Les seules permissions qui peuvent les utiliser sont READ_PRIVILEGED_PHONE_STATE et elles ne peuvent pas être utilisées par des applications tierces - Fabrication et Applications logicielles. Si vous utilisez cette méthode, vous obtiendrez une erreur Security exception ou null .
Vous pouvez toujours essayer d'obtenir un identifiant unique en utilisant :
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID);
L'alerte Android studio est là : Using getString to get device identifiers is not recommended.
developer.Android.com/training/articles/utilisateur-donnees-ids.html
Que voulez-vous dire par "essayer d'obtenir un identifiant unique". Cette tentative échouera toujours pour les applications qui ne font pas partie du système, n'est-ce pas ?
La meilleure façon d'obtenir le numéro IMEI est la suivante :
public static String getIMEIDeviceId(Context context) {
String deviceId;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{
deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
} else {
final TelephonyManager mTelephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return "";
}
}
assert mTelephony != null;
if (mTelephony.getDeviceId() != null)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
deviceId = mTelephony.getImei();
}else {
deviceId = mTelephony.getDeviceId();
}
} else {
deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}
}
Log.d("deviceId", deviceId);
return deviceId;
}
Il suffit de copier la méthode et de l'utiliser. C'est sûr. Cependant, vous savez peut-être que vous ne pouvez pas obtenir l'IMEI dans Android Q (version 10). Dans ce code, vous pouvez obtenir un identifiant unique (alternative id) à travers n'importe quel appareil ou n'importe quel niveau d'API. Il fonctionne à 100%. Merci ! Et bon codage :)
Comme le suggèrent les meilleures pratiques. " vous pouvez éviter d'utiliser les identifiants matériels, tels que le SSAID (Android ID) et l'IMEI, sans limiter les fonctionnalités requises. "
Préférez un ID d'instance tel que String uniqueID = UUID.randomUUID().toString();
o FirebaseInstanceId.getInstance().getId();
Les utilisateurs peuvent vouloir réinitialiser leurs préférences en réinstallant l'application. Par conséquent, la persistance des informations par le biais des réinstallations d'applications n'est pas une bonne pratique. C'est pourquoi l'utilisation d'identifiants matériels n'est pas recommandée, car ils sont liés à l'appareil et l'utilisateur ne peut pas les réinitialiser. Un identifiant lié à l'application est suffisant dans la plupart des cas. Voir les meilleures pratiques developer.Android.com/training/articles/user-data-ids#java
Je suppose que cela dépendrait du cas d'utilisation. Comme indiqué ci-dessus, il n'est pas recommandé de conserver les identifiants des utilisateurs après la réinstallation des applications, car les utilisateurs sont alors soumis à un suivi à long terme et ne peuvent pas les réinitialiser. Cet article propose des solutions pour différents cas d'utilisation developer.Android.com/training/articles/user-data-ids#java
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.