Короткий ответ: в 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. Для соседних задач пригодятся эти разборы:
- Как получить UUID Android-устройства в Kotlin Jetpack
- Kotlin Android: первый экран без перегруза
- Как в Android Studio поменять Kotlin на Java
- Как воспроизвести аудио на Kotlin в Android Studio



