web-dev-qa-db-fra.com

Je reçois IMEI null dans Android Q?

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

existe-t-il une solution pour cela?

40
Aman Verma

Android Q a limité l'accès à la fois pour IMEI et le numéro de série. Il est disponible uniquement pour la plate-forme et les applications avec une autorisation spéciale de l'opérateur. De plus, l'autorisation READ_PRIVILEGED_PHONE_STATE n'est pas disponible pour les applications non plateforme.

Si vous essayez d'y accéder, lance l'exception ci-dessous

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

Voir également Problème

26
takharsh

Cela ne fonctionnerait tout simplement pas à partir de Android Q. Les applications tierces ne peuvent pas utiliser IMEI ni le numéro de série d'un téléphone et d'autres identifiants d'appareil non réinitialisables.

Les seules autorisations qui peuvent les utiliser sont READ_PRIVILEGED_PHONE_STATE et qui ne peuvent pas être utilisées par des applications tierces - Fabrication et applications logicielles. Si vous utilisez cette méthode, vous obtiendrez une erreur de sécurité ou obtenez 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);
9
Aditya Bhawsar

Comme le suggèrent les meilleures pratiques. "vous pouvez éviter d'utiliser des identifiants matériels, tels que SSAID (ID Android) et IMEI, sans limiter les fonctionnalités requises."

Optez plutôt pour un ID d'instance tel que String uniqueID = UUID.randomUUID().toString(); ou FirebaseInstanceId.getInstance().getId();

5
Joe Malebe

Si votre application cible Android 10 ou supérieur, une exception SecurityException se produit.

Les modules suivants sont concernés ...

Build
    getSerial()
TelephonyManager
    getImei()
    getDeviceId()
    getMeid()
    getSimSerialNumber()
    getSubscriberId()

Vous ne pouvez donc pas obtenir d'IMEI pour Android 10, vous devez utiliser un autre identifiant unique pour cela, comme Android ID

Il hex unique de 64 bits pour l'appareil

chaîne privée Android_id = Secure.getString (getContext (). getContentResolver (), Secure.Android_ID);

3
sushant suryawanshi

vous pouvez changer d'une autre manière, j'utilise uuid pour remplacer l'identifiant 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);
3
Ven Ren

Vous n'êtes pas sûr du numéro IMEI, mais vous pouvez obtenir le simSerialNumber et d'autres informations sur le transporteur de cette façon.

getSimSerialNumber () a besoin d'autorisations privilégiées à partir de Android 10 et les applications tierces ne peuvent pas enregistrer cette autorisation.

Voir: https://developer.Android.com/about/versions/10/privacy/changes#non-resettable-device-ids

Une solution possible consiste à utiliser TELEPHONY_SUBSCRIPTION_SERVICE de Android 5.1, pour récupérer le numéro de série de la carte SIM. Étapes ci-dessous:

  • Vérifiez l'autorisation READ_PHONE_STATE.
  • Obtenir la liste d'abonnement active (renvoie la liste de toutes les cartes SIM actives)
  • Récupérez les détails de la simulation dans Subscription Object.

       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 aide

3
Adarsh Chithran

Ciblage Android Q, les applications tierces ne peuvent pas du tout accéder à IMEI. Android Q doc est trompeur en déclarant

À partir de Android Q, les applications doivent avoir l'autorisation privilégiée READ_PRIVILEGED_PHONE_STATE pour accéder aux identifiants non réinitialisables de l'appareil, qui incluent à la fois IMEI et le numéro de série. https: // développeur. Android.com/preview/privacy/data-identifiers#device-ids

Mais quand j'ai essayé de l'implémenter, je reçois cette exception:

Java.lang.SecurityException: getDeviceId: The user 10132 does not meet the requirements to access device identifiers.

Quelqu'un l'avait signalé sur le suivi des problèmes de Google, où un googleur a déclaré qu'il s'agissait d'un comportement prévu et que l'IMEI sur Q + n'était disponible que pour les applications de niveau système.

Statut: ne sera pas corrigé (comportement prévu). Cela fonctionne comme prévu. L'IMEI est un identifiant personnel et cela n'est pas donné aux applications par principe. Il n'y a aucune solution de contournement.

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

2
Yousuf Sohail

Selon google docs .

Restriction sur les identifiants d'appareil non réinitialisables

À partir de Android 10, les applications doivent avoir l'autorisation privilégiée READ_PRIVILEGED_PHONE_STATE pour accéder aux identifiants non réinitialisables de l'appareil, qui incluent à la fois IMEI et le numéro de série.

Attention: les applications tierces installées à partir de Google Play Store ne peuvent pas déclarer d'autorisations privilégiées.

Ainsi, au lieu d'imei, vous pouvez obtenir Android ID unique.

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

Si vous en avez besoin, vous pouvez essayer d'installer un profil professionnel sur le téléphone mobile et inclure votre application dans le même package ou vice versa.

J'ai essayé et ça marche, c'est simple si vous suivez ce repo: https://github.com/googlesamples/Android-testdpc

Lorsque vous installez le profil professionnel, votre application est installée dans ce profil et vous aurez accès à l'IMEI.

Et maintenant, il y a un autre exemple fixé hier à Android 10: https://github.com/Android/enterprise-samples/pull/29

0
Joel Garcia

Ils ont mentionné: Si votre application est l'application propriétaire de l'appareil ou du profil, vous n'avez besoin que de l'autorisation READ_PHONE_STATE pour accéder aux identifiants d'appareil non réinitialisables, même si votre application cible Android 10 ou plus).

J'ai essayé de déployer via EMM en tant qu'application propriétaire de l'appareil, mais sans succès.

0
Sy Nguyen Dinh

Je suis en retard pour poster une réponse. Je crois toujours que ma réponse aidera quelqu'un. Android 10 Développeur restreint pour accéder au numéro IMEI.

Vous pouvez avoir une autre solution en obtenant l'ID du logiciel. Vous pouvez utiliser l'ID 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
Satish