Как идентифицировать устройство, чтобы пользователь мог получить в настройках устройства свой идентификатор?

Есть одна сторона которая имеет данные об устройстве, имей и прочее прочее

И есть приложение в которое надо зашить определенный алгоритм уникальное идентификатора, чтобы сторона могла знать этот идентификатор и связать с ним данные какие-либо.

В случае imei это очень легко решается, сторона imei знает и может формировать легко привязку данных к этому imei. Каким образом можно зашить уникальный идентификатор приложения и при этом чтобы пользователь устройства мог узнать этот идентифкатор?

Работать должно на android 10+ поэтому imei и серийный номер отпадают.


Ответы (1 шт):

Автор решения: Battlevisek

Если требуется получить идентификатор, который обязательно должен быть в настройках устройства, то есть способ это сделать без root прав - использовать mac адрес. Для этого требуется сделать приложение Device Owner с помощью adb команды adb shell dpm set-device-owner, а затем использовать метод getWifiMacAddress()

Если же идентификатор допустимо показывать пользователю только внутри самого приложения, есть следующие способы:

1 способ - если не требуется сохранение идентификатора между переустановками приложения. В этом случае в соответствии с Best practices for unique identifiers рекомендуется использовать GUID:

Use a Firebase installation ID (FID) or a privately stored GUID whenever possible for all other use cases, except for payment fraud prevention and telephony. For the vast majority of non-ads use cases, an FID or GUID should be sufficient.

GUID позволит обеспечить достаточную уникальность вашего идентификатора:

Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028×1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала

Сгенерировать GUID можно так:

val uniqueID = UUID.randomUUID().toString()

Однако хранить идентификатор придется самостоятельно. Вы можете сохранить идентификатор, например в Shared Preferences. В таком случае когда вам нужен идентификатор, проверяете, есть ли он в Shared Preferences. Если его там нет, генерируете и сохраняете.

2 способ - если требуется, чтобы идентификатор сохранялся после переустановки приложения. Используйте ANDROID_ID. На Android ниже версии 8.0 этот идентификатор генерировался, когда пользователь впервые настраивал устройство и не отличался для разных приложений. На Android версии 8.0 и выше, этот идентификатор для каждого приложения генерируется отдельный, но остается, если приложение было переустановлено. Однако идентификатор сбрасывается после OTA обновления или сброса к заводским настройкам. Подробнее в документации

Получить ANDROID_ID можно так:

val uniqueID = Settings.Secure.getString(applicationContext.contentResolver, Settings.Secure.ANDROID_ID)
→ Ссылка