Я получаю нулевой IMEI ID от телефонного менеджера. Что делать?
есть ли обходной путь для этого?
Я получаю нулевой IMEI ID от телефонного менеджера. Что делать?
есть ли обходной путь для этого?
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
Это просто не будет работать с Android Q. Сторонние приложения не могут использовать IMEI, а также серийный номер телефона и другие не сбрасываемые идентификаторы устройства.
Единственными разрешениями, которые могут использовать их, является READ_PRIVILEGED_PHONE_STATE, и они не могут использоваться никакими сторонними приложениями - Производством и Программными приложениями. Если вы используете этот метод, вы получите ошибку безопасности исключение или получите ноль.
Вы все еще можете попытаться получить уникальный идентификатор, используя:
import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID);
Как подсказывают лучшие практики. "Вы можете избежать использования аппаратных идентификаторов, таких как SSAID (Android ID) и IMEI, без ограничения требуемой функциональности".
Скорее перейдите для идентификатора экземпляра, такого как String uniqueID = UUID.randomUUID().toString();
или FirebaseInstanceId.getInstance().getId();
Для получения 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();
}
Они упомянули: Если ваше приложение является приложением владельца устройства или профиля, вам нужно только разрешение READ_PHONE_STATE для доступа к не сбрасываемым идентификаторам устройств, даже если ваше приложение предназначено для Android 10 или выше.
Я попытался выполнить развертывание через EMM в качестве приложения для владельца устройства, но безуспешно.
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 - это персональный идентификатор, и он не выдается приложениям в соответствии с политикой. Обходного пути нет.