77 votes

J'ai un IMEI nul dans Android Q ?

J'obtiens l'IMEI ID null du telephonymanager. Que faire ?

Y a-t-il une solution de contournement pour cela ?

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.

65voto

takharsh Points 1008

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

Consultez également le numéro

25voto

Satish Points 26

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;
}

0 votes

Cela ne posera-t-il pas de problème ? Parce que Secure.ANDROID_ID n'est pas non plus recommandé par Google.

0 votes

Cela changera-t-il si le logiciel est mis à jour ?

15voto

Aditya Bhawsar Points 146

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);

0 votes

L'alerte Android studio est là : Using getString to get device identifiers is not recommended. developer.Android.com/training/articles/utilisateur-donnees-ids.html

0 votes

Quelle est la meilleure façon d'obtenir un identifiant unique ? @zakjma

0 votes

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 ?

10voto

Technical Rival Points 71

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 :)

8voto

Joe Malebe Points 169

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();

2 votes

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

0 votes

Quel est le moyen de détecter une application spécifique, même après sa réinstallation ?

1 votes

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.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