Google I/O 2025 пройдет 20-21 мая. Ждем новые анонсы и много слов AI. Скорее всего в рамках Googel IO и выпустят стабильную Android 16
#googleio
#googleio
Google выпустила Codelab по погружению в разработку под Android XR - ОС на основе Android для устройств смешенной реальности
#android #codelab #androidxr
#android #codelab #androidxr
This media is not supported in your browser
VIEW IN TELEGRAM
Демонстрация добавления перевода строк с помощь Gemini в Android Studio
Какие сценарии для AI в IDE вы еще бы хотели увидеть ?
#androidstudio #gemini
Какие сценарии для AI в IDE вы еще бы хотели увидеть ?
#androidstudio #gemini
Не нужно делать UseCase для простых вызовов
В статье приводится пример с получением данных через UseCase с простым вызовом метода из единственной зависимости. Конечно, есть принятый подход, но зачем делать лишний класс только потому, что "так принято".
Мне не нравится делать так:
а на замену просто получать данные из репозитория в ViewModel:
Не делайте избыточный код просто потому, что так принято у всех остальных или потому, что так сказал какой-то умный эксперт по разработке. Оценивайте здраво, что вам нужно сейчас, и при изменении требований вводите новые элементы в архитектуре.
#android #архитектура #лучшиепрактики
В статье приводится пример с получением данных через UseCase с простым вызовом метода из единственной зависимости. Конечно, есть принятый подход, но зачем делать лишний класс только потому, что "так принято".
Мне не нравится делать так:
class FetchMemesUseCaseImpl(
private val memeRepository: MemeRepository
) : FetchMemesUseCase {
override suspend operator fun invoke(): List<Meme> {
return memeRepository.fetchMemes()
}
class MemeListViewModel(
private val fetchMemesUseCase: FetchMemesUseCase
) : ViewModel()
а на замену просто получать данные из репозитория в ViewModel:
class MemeListViewModel(
private val memeRepository: MemeRepository
) : ViewModel()
Не делайте избыточный код просто потому, что так принято у всех остальных или потому, что так сказал какой-то умный эксперт по разработке. Оценивайте здраво, что вам нужно сейчас, и при изменении требований вводите новые элементы в архитектуре.
#android #архитектура #лучшиепрактики
В вашем коде есть UseCase в одну строку? (как в посте выше)
Anonymous Poll
50%
Да
29%
Нет
2%
Не знаю
15%
Не использую UseCase
0%
Не пишу код
4%
Не участвую в опросе
Увлекательное путешествие в мир безопасности Android! Разобрали самые интересные и коварные уязвимости, такие как Path Traversal, SQL-инъекции и Tapjacking. Но основное внимание уделили WebView: неправильной валидации данных, уязвимостям в библиотеке для парсинга URL, JavaScript Interface и загрузке диплинков.
В докладе нет скучных терминов и монотонных объяснений. Вместо этого — захватывающая история поиска уязвимостей и их устранения, основанная на личном опыте при разработке приложений.
Будет полезно всем тем, кто интересуется безопасностью Android-приложений.
📹 Версия на VK Video
#android #безопасность #mobius
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как лишние ресурсы могут повлиять на UI вашего приложения
Библиотеки от Google и других популярных SDK часто содержат строки для десятков локалей, тогда как большинство приложений поддерживают всего 7–10 наиболее востребованных языков.
Механизм выбора ресурсов в Android устроен таким образом, что система подбирает наиболее подходящий ресурс с учётом квалификаторов (например, локали). Если для конкретной локали, установленной на устройстве, в вашем проекте отсутствует соответствующий перевод, система может использовать строку из библиотеки по умолчанию. Это может привести к неожиданному отображению интерфейса.
Чтобы избежать подобных ситуаций, вы можете явно задать набор локалей, которые поддерживает ваше приложение. Тогда все ресурсы для неуказанных локалей не попадут в финальный APK, что не только снижает его размер, но и обеспечивает предсказуемость UI.
Пример настройки в build.gradle.kts (application модуль):
Ранее Android Gradle Plugin позволял фильтровать ресурсы по различным группам квалификаторов (например, плотность экрана, ориентация и т.д.), однако начиная с AGP 8.0 эта возможность объявлена устаревшей и поддерживается только фильтрация по локалям. Это связано с тем, что App Bundle эффективно разделяет ресурсы по плотности экрана, а применение других фильтров использовалось крайне редко.
#android #gradle #локализация #лучшиепрактики
Библиотеки от Google и других популярных SDK часто содержат строки для десятков локалей, тогда как большинство приложений поддерживают всего 7–10 наиболее востребованных языков.
Механизм выбора ресурсов в Android устроен таким образом, что система подбирает наиболее подходящий ресурс с учётом квалификаторов (например, локали). Если для конкретной локали, установленной на устройстве, в вашем проекте отсутствует соответствующий перевод, система может использовать строку из библиотеки по умолчанию. Это может привести к неожиданному отображению интерфейса.
Чтобы избежать подобных ситуаций, вы можете явно задать набор локалей, которые поддерживает ваше приложение. Тогда все ресурсы для неуказанных локалей не попадут в финальный APK, что не только снижает его размер, но и обеспечивает предсказуемость UI.
Пример настройки в build.gradle.kts (application модуль):
android {
androidResources {
// Автоматически сгенерировать список локалей на основе ресурсов проекта
// По умолчанию false
generateLocaleConfig = true
// Либо явно указать поддерживаемые локали
localeFilters.addAll(setOf("en", "ru", "es", "de"))
}
}Ранее Android Gradle Plugin позволял фильтровать ресурсы по различным группам квалификаторов (например, плотность экрана, ориентация и т.д.), однако начиная с AGP 8.0 эта возможность объявлена устаревшей и поддерживается только фильтрация по локалям. Это связано с тем, что App Bundle эффективно разделяет ресурсы по плотности экрана, а применение других фильтров использовалось крайне редко.
#android #gradle #локализация #лучшиепрактики
Forwarded from AvitoTech
This media is not supported in your browser
VIEW IN TELEGRAM
Три слова для привлечения внимания любого тимлида: OKR, планирование и мотивация команды 🚀
А теперь, пока вы тут: встречаемся 26 февраля на Avito TeamLead Drinkup #3!
Обсудим, как оценивать софт скиллы на собеседовании, растить и мотивировать команду и зачем ИИ в менеджменте. Без нетворка, конечно, не оставим — он будет после основной программы.
Для регистрации кликайте сюда. Осталось не так много мест!🔥
#management_avitotech
А теперь, пока вы тут: встречаемся 26 февраля на Avito TeamLead Drinkup #3!
Обсудим, как оценивать софт скиллы на собеседовании, растить и мотивировать команду и зачем ИИ в менеджменте. Без нетворка, конечно, не оставим — он будет после основной программы.
Для регистрации кликайте сюда. Осталось не так много мест!
#management_avitotech
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышла вторая из четырёх Beta версий Android 16. Улучшили работу с медиа, новые возможности Camera2 API, форсирование Edge-to-edge и другие. Как всегда расскажу отдельными постами про самые интересные фичи
#android16
Please open Telegram to view this post
VIEW IN TELEGRAM
val intent = Intent(MediaStore.ACTION_MOTION_PHOTO_CAPTURE)
// или MediaStore.ACTION_MOTION_PHOTO_CAPTURE_SECURE
// Задаем куда сохранить
intent.putExtra(MediaStoreEXTRA_OUTPUT, uri)
// или Uri через ClidData
intent.setClipData(clipData)
context.startActivity(intent)
#android16
Please open Telegram to view this post
VIEW IN TELEGRAM
В Android 16 добавлены новые режимы гибридной автоэкспозиции (Hybrid AE) в Camera2. Теперь можно вручную управлять отдельными параметрами экспозиции, оставляя остальное на алгоритм автоэкспозиции (AE).
Доступны два новых режима:
👉 ISO + AE – вы задаёте ISO, а автоэкспозиция регулирует выдержку.
👉 Выдержка + AE – вы управляете временем экспозиции, а AE настраивает ISO.
Это даёт больше гибкости по сравнению с прежним подходом, где нужно было либо полностью полагаться на автоэкспозицию, либо вручную контролировать все параметры.
fun setISOPriority() {
// ...
val availablePriorityModes = mStaticInfo.characteristics.get(
CameraCharacteristics.CONTROL_AE_AVAILABLE_PRIORITY_MODES
)
// ...
// Включение AE режима
reqBuilder.set(
CaptureRequest.CONTROL_AE_MODE,
CameraMetadata.CONTROL_AE_MODE_ON
)
reqBuilder.set(
CaptureRequest.CONTROL_AE_PRIORITY_MODE,
CameraMetadata.CONTROL_AE_PRIORITY_MODE_SENSOR_SENSITIVITY_PRIORITY
)
reqBuilder.set(
CaptureRequest.SENSOR_SENSITIVITY,
TEST_SENSITIVITY_VALUE
)
val request: CaptureRequest = reqBuilder.build()
// ...
}#android #android16 #камера #camera2
Please open Telegram to view this post
VIEW IN TELEGRAM
В Android 16 появилась поддержка точной настройки цветовой температуры и оттенка для камеры, что особенно полезно для профессиональных видеосъёмочных приложений.
Ранее в Android управление балансом белого осуществлялось через CONTROL_AWB_MODE, но выбор ограничивался предустановками (например, “Лампа накаливания”, “Облачно”, “Сумерки”).
Теперь новый режим COLOR_CORRECTION_MODE_CCT позволяет использовать параметры COLOR_CORRECTION_COLOR_TEMPERATURE и COLOR_CORRECTION_COLOR_TINT для более точной коррекции баланса белого на основе коррелированной цветовой температуры (CCT).
Пример кода:
fun setCCT() {
val colorTemperatureRange: Range<Int> =
mStaticInfo.characteristics[CameraCharacteristics.COLOR_CORRECTION_COLOR_TEMPERATURE_RANGE]
// Переключаемся в ручной режим для активации CCT
reqBuilder[CaptureRequest.CONTROL_AWB_MODE] = CameraMetadata.CONTROL_AWB_MODE_OFF
reqBuilder[CaptureRequest.COLOR_CORRECTION_MODE] = CameraMetadata.COLOR_CORRECTION_MODE_CCT
reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TEMPERATURE] = 5000
reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TINT] = 30
val request: CaptureRequest = reqBuilder.build()
}Теперь разработчики могут добиваться более точной цветопередачи, что особенно важно для профессиональной видеосъёмки.
#android #android16 #camera2 #камера
Please open Telegram to view this post
VIEW IN TELEGRAM
Появилась поддержка UltraHDR в HEIC, также работают на поддержкой в AVIF. Также добавили новые параметры UltraHDR из черновика стандарта ISO 21496-1
#android #android16
Please open Telegram to view this post
VIEW IN TELEGRAM
В Android 15 есть флаг R.attr#windowOptOutEdgeToEdgeEnforcement, который позволял отключить для приложения "обязательное" включение Edge-to-Edge. В Android 16 флаг помечен как устаревший (deprecated) и система его игнорирует, а значит для вашего приложения включится режим отображения от края до края экрана.
#android #android16 #edgetoedge
Please open Telegram to view this post
VIEW IN TELEGRAM
В Android 15 была добавлена поддержка 16 KB страниц памяти для оптимизации производительности платформы. В Android 16 появился режим совместимости, который позволяет запускать некоторые приложения, созданные для 4 KB страниц памяти, на устройствах с 16 KB страницами.
👉 Если Android обнаружит, что в вашем приложении используются 4 KB выровненные страницы памяти, система автоматически включит режим совместимости и покажет пользователю диалоговое окно с уведомлением.
👉 Чтобы избежать отображения этого диалога при запуске приложения, добавьте в AndroidManifest.xml атрибут
<application android:pageSizeCompat="true" />👉 Однако для максимальной производительности, стабильности и надёжности рекомендуется адаптировать приложение к 16 KB страницам, касается тех у кого есть нативные библиотеки и код
Подробнее о том, как обновить приложения для поддержки 16 KB страниц памяти, читайте в блоге.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
В региональных настройках Android 16 пользователь сможет менять метрическую систему
Теперь разработчикам в зависимости от настроек рекомендуется форматировать размеры в приложениях, но вот API из коробки для того не дали.
#android #android16
Теперь разработчикам в зависимости от настроек рекомендуется форматировать размеры в приложениях, но вот API из коробки для того не дали.
#android #android16
Android Broadcast
В региональных настройках Android 16 пользователь сможет менять метрическую систему Теперь разработчикам в зависимости от настроек рекомендуется форматировать размеры в приложениях, но вот API из коробки для того не дали. #android #android16
Пример кода как работать с разными метрическими системами в коде
#android #android16
val lengthInMeters = 10.0 // Базовое значение в метрах
textView.text = getLocalizedLength(this, lengthInMeters)
fun getLocalizedLength(
context: Context,
meters: Double,
locale: Locale = Locale.getDefault(),
): String {
if (isMetric(context)) {
return "%.2f m".format(locale, meters)
} else {
val feet = meters * 3.28084
return "%.2f ft".format(locale, feet)
}
}
fun isMetric(context: Context): Boolean {
// Получаем текущий регион
val locale = context.resources.configuration.locales[0]
return when (locale.country) {
// США, Либерия, Мьянма используют имперскую систему
"US", "LR", "MM" -> false
else -> true // Остальные — метрическую
}
}
#android #android16