Я получаю IMEI нулевой в Android Q?

Я получаю нулевой IMEI ID от телефонного менеджера. Что делать?

есть ли обходной путь для этого?

Ответ 1

Android Q ограничил доступ как для IMEI, так и для серийного номера. Он доступен только для платформы и приложений со специальным разрешением оператора. Кроме того, разрешение READ_PRIVILEGED_PHONE_STATE недоступно для неплатформенных приложений.

Если вы пытаетесь получить к нему доступ, выдает ниже исключения

java.lang.SecurityException: getImeiForSlot: The user 10180 does not meet the requirements to access device identifiers.

Пожалуйста, обратитесь к документации: https://developer.android.com/preview/privacy/data-identifiers#device-ids

Также см. выпуск

Ответ 2

Это просто не будет работать с Android Q. Сторонние приложения не могут использовать IMEI, а также серийный номер телефона и другие не сбрасываемые идентификаторы устройства.

Единственными разрешениями, которые могут использовать их, является READ_PRIVILEGED_PHONE_STATE, и они не могут использоваться никакими сторонними приложениями - Производством и Программными приложениями. Если вы используете этот метод, вы получите ошибку безопасности исключение или получите ноль.

Вы все еще можете попытаться получить уникальный идентификатор, используя:

import android.provider.Settings.Secure;

private String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID);

Ответ 3

Как подсказывают лучшие практики. "Вы можете избежать использования аппаратных идентификаторов, таких как SSAID (Android ID) и IMEI, без ограничения требуемой функциональности".

Скорее перейдите для идентификатора экземпляра, такого как String uniqueID = UUID.randomUUID().toString(); или FirebaseInstanceId.getInstance().getId();

Ответ 4

Для получения IMEI это также шаги:

1) Определить разрешение в манифесте:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

или если уровень API> 22

ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)

2) Получить IMEI в Java с помощью TelephonyManager

((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()

Скомпилируйте оба (1) и (2) пункта:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            imei = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
        }
    } else {
        imei = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    }

Ответ 5

Они упомянули: Если ваше приложение является приложением владельца устройства или профиля, вам нужно только разрешение READ_PHONE_STATE для доступа к не сбрасываемым идентификаторам устройств, даже если ваше приложение предназначено для Android 10 или выше.

Я попытался выполнить развертывание через EMM в качестве приложения для владельца устройства, но безуспешно.

Ответ 6

TL;DR; IMEI просто недоступен на Android Q+

Ориентированные на Android Q, сторонние приложения вообще не могут получить доступ к IMEI. Android Q doc вводит в заблуждение при заявлении

Начиная с Android Q, приложения должны иметь привилегированное разрешение READ_PRIVILEGED_PHONE_STATE для доступа к не сбрасываемым идентификаторам устройства, которые включают IMEI и серийный номер. https://developer.android.com/preview/privacy/data-identifiers#device-ids

Но когда я действительно пытался реализовать это, я получаю это исключение:

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

Кто-то сообщил об этом в системе отслеживания проблем Google, где Гуглер сказал, что это предполагаемое поведение, и IMEI на Q+ доступен только для приложений системного уровня.

Статус: не будет исправлено (предполагаемое поведение). Работает по назначению. IMEI - это персональный идентификатор, и он не выдается приложениям в соответствии с политикой. Обходного пути нет.

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