TGINSIGHT CHAT
Android Broadcast
@android_broadcast
TechnologiesПодборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab#MQRZR
Posts récents
Page 74 sur 84 · 1,000 posts
Publié 24 févr.
🪙Настройка качества контроля кода в KMP проекте и автоматизация запуска проверок локально и на CI (40 мин) Продолжаю рассказывать про ход разработки KMP + Compose клиента для Frame.io. В новой части показываю как я настроил анализаторы кода: KtLint, Detekt, Gitleaks, Manifest Guard и другие, а также как стоит подходить к оптимизации скорости проверок локально и на CI. Полезно как для командных проектов, так и для ваших личных проектов (я бы тут даже сказал что еще важнее)! ✉️ Также видео доступно в Telegram (нужно оформить подписку) Список всех вышедших и планируемых видео тут #AndroidBroadcast#frameio#kmp#android#ios#качествокода
Publié 22 févr.
🏝💉Стал доступен плагин для проверки Koin из IDE Проблема с валидацией DI графа зависимостей при использования Koin - очень актуальная. Авторы решили подойти к её решению через анализ кода проектов в IDE, хотя уже обсуждали перенос инструмента в CLI. Для использования вам понадобится зарегистрироваться на сайте Kotzilla. #kotlin#idea#koin
Publié 20 févr.
📹 Запись Мок-собеседование Android-разработчика в Контур Тех. собеседование прошло в прямом эфире по формат проектирование приложения, кодинг и блиц по Android. 👨💻 Эксперт: Евгений Мельцайкин - старший инженер-программист. 👨🏫 Кандидат: Android-разработчик с 2 годами опыта. #AndroidBroadcast#собеседование#собес
Publié 20 févr.
Какой контент вы хотите увидеть на YouTube канале Android Broadcast? Пишите в комментариях
Publié 20 févr.
Чтобы оценить как ваше приложение поддерживает accesibility, то можете поставить приложение Accessibility Scanner #android#accessibility
Hashtags
Publié 20 févr.
Анализ Android-фич на доступность и внедрение accessibility в процесс разработки (7м) В статье Android-разработчик из VK рассказывает о совместной работе разработчиков и дизайнеров над повышением доступности контента для людей с ограниченными возможностями, использующих скринридеры. Были проанализированы различные фичи и предприняты шаги для обеспечения доступности функциональности. Ключевые моменты: 👉 Обеспечение корректной работы с фокусом в UI 👉 Единообразие навигации по элементам UI 👉 Добавление локализованных contentDescription, чтобы они озвучивались системой TalkBack #android#accessibility
Hashtags
Publié 20 févr.
Обновление 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#сеть#лучшиепрактики
Hashtags
Publié 19 févr.
Publié 19 févr.
🤖Новая защита от Intent Redirect в Android 16 Начиная с Android 16, система получила усиленную защиту от атак с редиректом Intent – механизма, с помощью которого злоумышленники могли подменять содержимое Intent для запуска приватных компонентов. Благодаря обновлению: 🔒 Защита по умолчанию: Система автоматически проверяет входящие Intent, снижая риск выполнения недоверенных операций. 🛠 Минимальные изменения для разработчиков: Большинство приложений, использующих стандартный механизм Intent, продолжат работать без проблем, однако рекомендуется протестировать проекты в новых условиях. 💡 Повышенная безопасность: Новые меры помогают предотвратить несанкционированный доступ к данным и выполнение привилегированных действий. #android#android16#безопасность
Hashtags
Publié 19 févr.
🤖 Шаринг ключей из 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#безопасность
Hashtags
Publié 19 févr.
🤖Форматируйте дату и время на основе настроек пользователя В большинстве приложений приходится выводить время и дату, но в каком формате сделать это правильнее всего? Логично использовать формат, который применяется для локали пользователя, но в настройках системы пользователь может указывать формат времени и даты для отображения, а значит, ему хотелось бы видеть такой формат везде. Используйте класс 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#лучшиепрактики
Hashtags
Publié 19 févr.
История(12м) как в Альфа-Банке сокращали размер JSON файла, который передается на устройство для работы SDUI. Решением стала шаблонизация для отказа от одинаковых блоков UI с разными данными #оптимизация#json
Hashtags