Android Broadcast – Telegram
Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🤖 Появился новый Intent для съёмки Motion Photo

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
👍18
⚙️ Профессиональные функции Camera2 API. Гибридная автоэкспозиция 🎥

В 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
👍10🔥3
🤖 Точная настройка цветовой температуры и оттенка в Camera2

В 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
👍10👏2
🤖 Улучшения поддержки UltraHDR в Android 16

Появилась поддержка UltraHDR в HEIC, также работают на поддержкой в AVIF. Также добавили новые параметры UltraHDR из черновика стандарта ISO 21496-1

#android #android16
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
🤖 Включение Edge-to-edge для всех приложений без возможности выключения

В Android 15 есть флаг R.attr#windowOptOutEdgeToEdgeEnforcement, который позволял отключить для приложения "обязательное" включение Edge-to-Edge. В Android 16 флаг помечен как устаревший (deprecated) и система его игнорирует, а значит для вашего приложения включится режим отображения от края до края экрана.

#android #android16 #edgetoedge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🤯21
🤖 Режим совместимости работы приложения для работы с 16KB размером страницы памяти (для всех приложений)

В 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
👍14
This media is not supported in your browser
VIEW IN TELEGRAM
В региональных настройках Android 16 пользователь сможет менять метрическую систему

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

#android #android16
👍26
Android Broadcast
В региональных настройках Android 16 пользователь сможет менять метрическую систему Теперь разработчикам в зависимости от настроек рекомендуется форматировать размеры в приложениях, но вот API из коробки для того не дали. #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
🤯32👍10
Вышел багфикс Android Studio Ladybug Feature Drop (сейчас в стабильном релизе)

#androidstudio
🔥20👍6
Секреты JVM: что происходит с ошибками под капотом (4м)

Статья с примерами кода, как JVM обрабатывает исключения на низком уровне, что такое таблица исключений и какие сценарии используются для вариантов try-catch и try-finally.

#jvm
👍18
🏝 9 лет назад вышла первая версия Kotlin 🎉🎉🎉

Кажется, я совсем недавно еще работал с бета-версиями первой версии Kotlin, писал приложения с расписанием для университета, где учился, чтобы попробовать эту технологию. Тогда была только поддержка JVM и проводились эксперименты с JS.

Сегодня Kotlin - это уже целая экосистема💪, которая позволяет писать приложения для нескольких платформ, имеет огромное сообщество разработчиков, а также официальную поддержку от команды 🤖 Android в Google. А как хорош Compose Multiplatform ❤️❤️❤️

Уже появилось поколение разработчиков, которые начали свой путь именно с Kotlin для разработки под Android 🤯🤯🤯

Поделитесь в комментариях под постом в @kotlin_broadcast своей историей знакомства с этим языком и тем, что вас привлекло в нем.

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5217👍7
🛒 Представили Play Service TrustedTime API

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

// Создаем клиента для работы с Trusted Time API
val initializeTrustedTimeClientTask: Task =
TrustedTime.createClient(activity)

val trustedTimeClient: TrustedTimeClient =
initializeTrustedTimeClientTask.await()

val curTime: Long? = trustedTimeClient.computeCurrentUnixEpochMillis()
// Используем системное время, если нет возможности получить из TrustedTime API
// Может не подойти в вашем случае
?: System.currentTimeMillis()


Поддерживается Android 5.0 и выше (SDK 21+)

#google #gms #android
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥108🤯11👍9
В приложении под Android (любой стек), которое вы разрабатываете, есть поддержка edge-to-edge ?
Anonymous Poll
11%
Что это?
52%
Да
23%
Нет
10%
На отдельных экранах
1%
Не пишу код/не пишу под Android
4%
Не участвую в опросе
👍2
🔥Пример разработки реального проекта на KMP и Compose

Лучший способ научиться чему-то - посмотреть, как это делают опытные разработчики, задавать вопросы и иметь доступ ко всем исходникам. Но где это взять и кому доверять?

Уже некоторое время я занимаюсь разработкой неофициального клиента для сервиса Frame.io, который используется теми, кто занимается монтажом видео. Скорее всего сам сервис вам будет неинтересен, но всё это я делаю на основе современного стека:
🏝Kotlin Multiplatform с ⚙️ Compose Multiplatform для Android, iOS и Desktop
🤯Многомодульная архитектура
🔥 Автоматизация процессов вокруг разработки

Весь процесс разработки я освещаю:
🔨 Макеты в Figma от дизайнера
✉️ Telegram чат с обсуждением процесса
📹 Видео с обзорами всех этапов
🐱 Исходный код в GitHub с продакшен подходом в разработке

Чтобы получить доступ, нужно оформить подписку уровня "Senior" на Boosty 🪙 или в Telegram ✉️, а также можно купить доступ один раз и навсегда

При достижении определенного прогресса в разработке проекта доступ по подписке будет закрыт и предоставляться будет только за единоразовую плату. Тем кто оформит подписку и будет оформлена на срок заморозки - автоматом получат доступ навсегда


#AndroidBroadcast #frameio #кодинг
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥10🤯3👏2💯1
31 марта 2025 закрывается App Center

Многие знают App Center как удобный способ распространения сборок Android и iOS приложений

#android #ios #microsoft
🤯20👍9👎4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Emerge's Build Distribution - замена App Center

Emerge's Build Distribution сделали бесплатным с ограничениями:
5 тысяч загруженных сборок в месяц
Без ограничений на кол-во пользователей
Интеграция SSO включена
SDK для автообновлений

Поддерживается 🤖 Android и iOS

#andorid #ios #инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🤯6👎4
История(12м) как в Альфа-Банке сокращали размер JSON файла, который передается на устройство для работы SDUI. Решением стала шаблонизация для отказа от одинаковых блоков UI с разными данными

#оптимизация #json
👎19👍9🤯3
🤖 Форматируйте дату и время на основе настроек пользователя

В большинстве приложений приходится выводить время и дату, но в каком формате сделать это правильнее всего? Логично использовать формат, который применяется для локали пользователя, но в настройках системы пользователь может указывать формат времени и даты для отображения, а значит, ему хотелось бы видеть такой формат везде. Используйте класс android.text.format.DateFormat (ВАЖНО не путать с одноименным классом из пакета java.text)
// Получаем текущую дату и время
val currentDate: Date = ...

// Получаем форматтер для даты, который учитывает региональные настройки пользователя
val dateFormatter: java.text.DateFormat = android.text.format.DateFormat.getDateFormat(context)
// Форматируем дату
val formattedDate = dateFormatter.format(currentDate)


// Получаем форматтер для времени, который учитывает настройку 12/24-часового формата
val timeFormatter = android.text.format.DateFormat.getTimeFormat(context)
// Форматируем время
val formattedTime = timeFormatter.format(currentDate)


// Получение порядка дня, месяца, года, который определил пользователь
// Например ['d', 'M', 'y']
val char[] = android.text.format.DateFormat.getDateFormatOrder(context)


val is24Hour = android.text.format.DateFormat.is24HourFormat(context)
// Выбираем шаблон форматирования времени
val pattern = if (is24Hour) "HH:mm" else "hh:mm a"
// Форматируем время согласно выбранному шаблону
val formattedTime = DateFormat.format(pattern, currentDate)


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

Если вы не хотите работать со старым Date API, которое есть с самых первый версий Java, то можно получить шаблон для форматирования времени на основе настроек пользователя с помощью android.text.format.DateFormat.getBestDateTimePattern()
// Получаем шаблон форматирования для времени. В данном случае шаблон "hm" используется для получения
// подходящего шаблона, который учитывает настройки пользователя (12/24-часовой формат).
val locale = Locale.getDefault()
val pattern: String = android.text.format.DateFormat.getBestDateTimePattern(locale, "hm")

// Создаем DateTimeFormatter из Java 9 Date Time API
val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern(pattern, locale)

// Пример форматирования текущего времени с использованием DateTimeFormatter
val formattedTime: String = LocalTime.now().format(dateTimeFormatter)
println("Отформатированное время: $formattedTime")


#android #лучшиепрактики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🤯6👎5
🤖 Шаринг ключей из Android Keystore с другими приложениями

В Android 16 KeyStoreManager получил возможность поделиться ключами с другими приложениями на устройстве пользователя

fun generateAndShareKey(targetUid: Int) {
// Генерация нового ключа в Android Keystore
val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
val keyGenSpec = KeyGenParameterSpec.Builder(
KEY_ALIAS,
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
.build()
keyGenerator.init(keyGenSpec)
val secretKey: SecretKey = keyGenerator.generateKey()

// Предоставление доступа к ключу приложению с заданным UID
val keyStoreManager = KeyStoreManager.getInstance()
val granted = keyStoreManager.grant(KEY_ALIAS, targetUid)
if (granted) {
Log.d(TAG, "Доступ предоставлен UID: $targetUid")
} else {
Log.e(TAG, "Не удалось предоставить доступ UID: $targetUid")
}
}


Пример отзыва доступа к ключу
fun revokeKeyAccess(targetUid: Int) {
// Отзыв доступа к ключу для приложения с заданным UID
val keyStoreManager = KeyStoreManager.getInstance()
val revoked = keyStoreManager.revoke(KEY_ALIAS, targetUid)
if (revoked) {
Log.d(TAG, "Доступ отозван для UID: $targetUid")
} else {
Log.e(TAG, "Не удалось отозвать доступ для UID: $targetUid")
}
}

#android #android16 #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🤯9👎4
🤖 Новая защита от Intent Redirect в Android 16

Начиная с Android 16, система получила усиленную защиту от атак с редиректом Intent – механизма, с помощью которого злоумышленники могли подменять содержимое Intent для запуска приватных компонентов. Благодаря обновлению:

🔒 Защита по умолчанию:
Система автоматически проверяет входящие Intent, снижая риск выполнения недоверенных операций.

🛠 Минимальные изменения для разработчиков:
Большинство приложений, использующих стандартный механизм Intent, продолжат работать без проблем, однако рекомендуется протестировать проекты в новых условиях.

💡 Повышенная безопасность:
Новые меры помогают предотвратить несанкционированный доступ к данным и выполнение привилегированных действий.

#android #android16 #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27👎4
👍35👎143🤯3