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
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
Обновление API токена в OkHttp/Retrofit

OkHttp поддерживает возможность обновления токена через специальный интерфейс Authenticator, которые срабатывает если API запрос на сервер вернет код 401 Unauthorized

class TokenAuthenticator(private val tokenProvider: TokenProvider) : Authenticator {

@Throws(IOException::class)
override fun authenticate(route: Route?, response: Response): Request? = runBlocking {
// Получаем новый токен
val newToken = tokenProvider.refreshToken()

// Если токен не удалось обновить, возвращаем null
if (newToken == null) return null

// Сохраняем новый токен
tokenProvider.saveToken(newToken)

// Создаем новый запрос с обновленным токеном
return response.request.newBuilder()
.header("Authorization", "Bearer $newToken")
.build()
}
}

// Пример API для работы с токеном
interface TokenProvider {
suspend fun getSavedToken(): String?
suspend fun saveToken(newToken: String)
suspend fun refreshToken(token: String?): String?
}

Добавление Authenticator в OkHttp
fun createOkHttpClient(tokenProvider: TokenProvider): OkHttpClient {
return OkHttpClient.Builder()
.authenticator(TokenAuthenticator(tokenProvider))
.build()
}


Я часто сталкивался с тем, что реализация бэкенда возвращает отличный HTTP код и тогда уже приходится делать решение через Interceptor. Делитесь в комментариях как вы пишите логике по обновлению токенов.

#okhttp #сеть #лучшиепрактики
🔥38👍11👎41🤯1
Анализ Android-фич на доступность и внедрение accessibility в процесс разработки (7м)

В статье Android-разработчик из VK рассказывает о совместной работе разработчиков и дизайнеров над повышением доступности контента для людей с ограниченными возможностями, использующих скринридеры. Были проанализированы различные фичи и предприняты шаги для обеспечения доступности функциональности.

Ключевые моменты:
👉 Обеспечение корректной работы с фокусом в UI
👉 Единообразие навигации по элементам UI
👉 Добавление локализованных contentDenoscription, чтобы они озвучивались системой TalkBack

#android #accessibility
👍8👎3
Чтобы оценить как ваше приложение поддерживает accesibility, то можете поставить приложение Accessibility Scanner

#android #accessibility
👍28👎4
Какой контент вы хотите увидеть на YouTube канале Android Broadcast? Пишите в комментариях
👍15👎12👏1🤯1
📹 Запись Мок-собеседование Android-разработчика в Контур

Тех. собеседование прошло в прямом эфире по формат проектирование приложения, кодинг и блиц по Android.
👨‍💻 Эксперт: Евгений Мельцайкин - старший инженер-программист.
👨‍🏫 Кандидат: Android-разработчик с 2 годами опыта.

#AndroidBroadcast #собеседование #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37🔥8👎32
🏝💉 Стал доступен плагин для проверки Koin из IDE

Проблема с валидацией DI графа зависимостей при использования Koin - очень актуальная. Авторы решили подойти к её решению через анализ кода проектов в IDE, хотя уже обсуждали перенос инструмента в CLI.

Для использования вам понадобится зарегистрироваться на сайте Kotzilla.

#kotlin #idea #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍7🤯6👎5
🪙 Настройка качества контроля кода в KMP проекте и автоматизация запуска проверок локально и на CI (40 мин)

Продолжаю рассказывать про ход разработки KMP + Compose клиента для Frame.io. В новой части показываю как я настроил анализаторы кода: KtLint, Detekt, Gitleaks, Manifest Guard и другие, а также как стоит подходить к оптимизации скорости проверок локально и на CI. Полезно как для командных проектов, так и для ваших личных проектов (я бы тут даже сказал что еще важнее)!

✉️ Также видео доступно в Telegram (нужно оформить подписку)

Список всех вышедших и планируемых видео тут

#AndroidBroadcast #frameio #kmp #android #ios #качествокода
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👎5👍4