Android 10: IMEI больше не доступен в API 29. Поиск альтернатив - PullRequest
0 голосов
/ 25 сентября 2019

Основная функция нашего клиентского приложения в значительной степени зависит от отслеживания устройств их клиентов, они предлагают продукты, которые привязаны к конкретному телефону (не его владельцу).Это было возможно с помощью устройства imei, но с изменениями конфиденциальности в Android 10 они сделали его недоступным.(https://developer.android.com/about/versions/10/privacy/changes).

Android имеет документацию о том, какой идентификатор использовать в конкретных случаях пользователя, но не соответствует нашему случаю, поскольку нам нужно, чтобы он был уникальным, постоянным и привязанным к устройству (или, по крайней мере, сложным для изменения). https://developer.android.com/training/articles/user-data-ids. Я рассматриваю Android ID как возможное решение или использую mac-адрес, зная, что они не на 100% надежны.

Есть какие-нибудь мысли, рекомендации, опыт?все может быть вариант

1 Ответ

0 голосов
/ 25 сентября 2019

1.Вы можете получить доступ к идентификатору устройства Android с помощью службы gms.см. приведенный ниже пример:

private DeviceInfoProvider mDeviceInfo = new DeviceInfoProvider(Context)
String mDeviceId = DeviceInfoProvider.getDeviceId(Context);
Log.d("DEVICE_ID" , mDeviceId);

2. Используйте диспетчер телефонии, который предоставляет уникальный идентификатор (например, IMEI).См. Пример,

import android.telephony.TelephonyManager;
import android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService(Context.
                TELEPHONY_SERVICE);
/*
* getDeviceId() returns the unique device ID.
* For example,the IMEI for GSM and the MEID or ESN for CDMA phones.
*/
String deviceId = telephonyManager.getDeviceId();
/*
* getSubscriberId() returns the unique subscriber ID,
*/
String subscriberId = telephonyManager.getSubscriberId();

Это требует android.permission.READ_PHONE_STATE для вашего пользователя, что может быть трудно оправдать, исходя из типа приложения, которое вы сделали.

Устройства без служб телефонии, такие как планшеты, должны сообщать уникальный идентификатор устройства, который доступен через android.os.Build.SERIAL начиная с Android 2.3 Gingerbread.Некоторые телефоны, имеющие услуги телефонии, также могут определять серийный номер.Подобно тому, как не все устройства Android имеют серийный номер, это решение не является надежным.

При первой загрузке устройства генерируется и сохраняется случайное значение.Это значение доступно через Settings.Secure.ANDROID_ID.Это 64-разрядное число, которое должно оставаться постоянным в течение всего срока службы устройства.ANDROID_ID кажется хорошим выбором для уникального идентификатора устройства, потому что он доступен для смартфонов и планшетов.Чтобы получить значение, вы можете использовать следующий код:

String androidId = Settings.Secure.getString (getContentResolver (), Settings.Secure.ANDROID_ID);

Однако значение может измениться, если на устройстве выполнен сброс к заводским настройкам.Существует также известная ошибка с популярной трубкой от производителя, где каждый экземпляр имеет одинаковый ANDROID_ID.Очевидно, что решение не является надежным на 100%.

Использовать UUID.Поскольку требование для большинства приложений состоит в том, чтобы идентифицировать конкретную установку, а не физическое устройство, хорошим решением является получение уникального идентификатора для пользователя, если использовать класс UUID.Следующее решение было представлено Рето Мейером из Google в презентации ввода-вывода Google,

SharedPreferences sharedPrefs = context.getSharedPreferences( PREF_UNIQUE_ID, Context.MODE_PRIVATE); uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);

...