UUID Android-устройства в Kotlin ViewModel: как получить безопасно

Короткий ответ: в Android обычно берут не настоящий UUID железа, а Settings.Secure.ANDROID_ID. Но получать его прямо внутри обычной ViewModel не стоит, потому что для этого нужен Context. Чище получить идентификатор в слое приложения или репозитории, а во ViewModel передать уже готовую строку

Пример функции:

fun getAndroidId(context: Context): String {
    return Settings.Secure.getString(
        context.contentResolver,
        Settings.Secure.ANDROID_ID
    )
}

Почему не хранить Context во ViewModel

Обычная ViewModel должна переживать повороты экрана и не держать ссылку на Activity. Если положить туда Activity или Fragment, можно получить утечки памяти и странные ошибки жизненного цикла

Если очень нужен контекст приложения, используйте AndroidViewModel, но в большинстве случаев лучше вынести чтение идентификатора в отдельный класс

class DeviceIdProvider(
    private val appContext: Context
) {
    fun getId(): String {
        return Settings.Secure.getString(
            appContext.contentResolver,
            Settings.Secure.ANDROID_ID
        )
    }
}

Во ViewModel передавайте провайдер или уже готовый id через DI, factory или репозиторий

class ProfileViewModel(
    private val deviceIdProvider: DeviceIdProvider
) : ViewModel() {

    val deviceId: String = deviceIdProvider.getId()
}

Это точно UUID?

Нет, строго говоря ANDROID_ID — это строковый идентификатор Android, а не UUID в формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Для аналитики, локальной привязки настроек или отладки его часто достаточно, но не называйте его аппаратным серийным номером

Если вам нужен именно UUID приложения, можно сгенерировать его один раз и сохранить в DataStore или SharedPreferences. Тогда id будет принадлежать установке приложения, а не устройству

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

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

Как проверить

Выведите значение во временный лог:

Log.d("DeviceId", deviceId)

Запустите приложение, откройте Logcat и убедитесь, что строка не пустая. После проверки лог лучше убрать, чтобы не светить идентификатор без причины

Частые ошибки

Передавать Activity во ViewModel

Не делайте так. Если нужен контекст, используйте application context в отдельном провайдере

Считать ANDROID_ID вечным

Идентификатор может меняться при сбросе устройства, смене пользователя или в зависимости от версии Android и подписи приложения. Не стройте на нем критичную авторизацию

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

Просить лишние разрешения

Для Settings.Secure.ANDROID_ID отдельное runtime-разрешение обычно не нужно. Если код просит доступ к телефону или серийному номеру, вы, вероятно, решаете другую задачу

Что почитать дальше по Kotlin

Если нужен общий маршрут по теме, откройте рубрику Kotlin. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x