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.

7voto

Ven Ren Points 217

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

7voto

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 :

  • Vérifiez la permission READ_PHONE_STATE.
  • Obtenir la liste des abonnements actifs ( Retourne la liste de toutes les cartes sim actives)
  • 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

6voto

rawhost Points 104

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

4voto

Ahsan Points 121

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

3voto

Yousuf Sohail Points 491

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.

https://issuetracker.google.com/issues/129583175#comment10

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