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 #инструменты
Emerge's Build Distribution сделали бесплатным с ограничениями:
✅ 5 тысяч загруженных сборок в месяц
✅ Без ограничений на кол-во пользователей
✅ Интеграция SSO включена
✅ SDK для автообновлений
Поддерживается
#andorid #ios #инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🤯6👎4
История(12м) как в Альфа-Банке сокращали размер JSON файла, который передается на устройство для работы SDUI. Решением стала шаблонизация для отказа от одинаковых блоков UI с разными данными
#оптимизация #json
#оптимизация #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 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
Начиная с Android 16, система получила усиленную защиту от атак с редиректом Intent – механизма, с помощью которого злоумышленники могли подменять содержимое Intent для запуска приватных компонентов. Благодаря обновлению:
🔒 Защита по умолчанию:
Система автоматически проверяет входящие Intent, снижая риск выполнения недоверенных операций.
🛠 Минимальные изменения для разработчиков:
Большинство приложений, использующих стандартный механизм Intent, продолжат работать без проблем, однако рекомендуется протестировать проекты в новых условиях.
💡 Повышенная безопасность:
Новые меры помогают предотвратить несанкционированный доступ к данным и выполнение привилегированных действий.
#android #android16 #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27👎4
КВИЗ Чтобы создать код сетевых вызовов Retrofit использует...
Anonymous Quiz
38%
Кодонегенерацию
24%
Рефлексию во время работы приложения для каждого вызова
28%
Java Dynamic Proxy Class
9%
Не участвую
👍35👎14❤3🤯3
Обновление API токена в OkHttp/Retrofit
OkHttp поддерживает возможность обновления токена через специальный интерфейс Authenticator, которые срабатывает если API запрос на сервер вернет код
Добавление
Я часто сталкивался с тем, что реализация бэкенда возвращает отличный HTTP код и тогда уже приходится делать решение через Interceptor. Делитесь в комментариях как вы пишите логике по обновлению токенов.
#okhttp #сеть #лучшиепрактики
OkHttp поддерживает возможность обновления токена через специальный интерфейс Authenticator, которые срабатывает если API запрос на сервер вернет код
401 Unauthorizedclass 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 в OkHttpfun createOkHttpClient(tokenProvider: TokenProvider): OkHttpClient {
return OkHttpClient.Builder()
.authenticator(TokenAuthenticator(tokenProvider))
.build()
}Я часто сталкивался с тем, что реализация бэкенда возвращает отличный HTTP код и тогда уже приходится делать решение через Interceptor. Делитесь в комментариях как вы пишите логике по обновлению токенов.
#okhttp #сеть #лучшиепрактики
🔥38👍11👎4❤1🤯1
Анализ Android-фич на доступность и внедрение accessibility в процесс разработки (7м)
В статье Android-разработчик из VK рассказывает о совместной работе разработчиков и дизайнеров над повышением доступности контента для людей с ограниченными возможностями, использующих скринридеры. Были проанализированы различные фичи и предприняты шаги для обеспечения доступности функциональности.
Ключевые моменты:
👉 Обеспечение корректной работы с фокусом в UI
👉 Единообразие навигации по элементам UI
👉 Добавление локализованных contentDenoscription, чтобы они озвучивались системой TalkBack
#android #accessibility
В статье Android-разработчик из VK рассказывает о совместной работе разработчиков и дизайнеров над повышением доступности контента для людей с ограниченными возможностями, использующих скринридеры. Были проанализированы различные фичи и предприняты шаги для обеспечения доступности функциональности.
Ключевые моменты:
👉 Обеспечение корректной работы с фокусом в UI
👉 Единообразие навигации по элементам UI
👉 Добавление локализованных contentDenoscription, чтобы они озвучивались системой TalkBack
#android #accessibility
👍8👎3
Чтобы оценить как ваше приложение поддерживает accesibility, то можете поставить приложение Accessibility Scanner
#android #accessibility
#android #accessibility
👍28👎4
Какой контент вы хотите увидеть на YouTube канале Android Broadcast? Пишите в комментариях
👍15👎12👏1🤯1
Тех. собеседование прошло в прямом эфире по формат проектирование приложения, кодинг и блиц по Android.
👨💻 Эксперт: Евгений Мельцайкин - старший инженер-программист.
👨🏫 Кандидат: Android-разработчик с 2 годами опыта.
#AndroidBroadcast #собеседование #собес
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37🔥8👎3❤2
Forwarded from Kotlin Multiplatform Broadcast
Проблема с валидацией DI графа зависимостей при использования Koin - очень актуальная. Авторы решили подойти к её решению через анализ кода проектов в IDE, хотя уже обсуждали перенос инструмента в CLI.
Для использования вам понадобится зарегистрироваться на сайте Kotzilla.
#kotlin #idea #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍7🤯6👎5
Продолжаю рассказывать про ход разработки KMP + Compose клиента для Frame.io. В новой части показываю как я настроил анализаторы кода: KtLint, Detekt, Gitleaks, Manifest Guard и другие, а также как стоит подходить к оптимизации скорости проверок локально и на CI. Полезно как для командных проектов, так и для ваших личных проектов (я бы тут даже сказал что еще важнее)!
Список всех вышедших и планируемых видео тут
#AndroidBroadcast #frameio #kmp #android #ios #качествокода
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👎5👍4
📅 6 марта в 19:00 (GMT+3)
Возможность проверить свои силы на техническом собеседовании и получить ценный фидбэк от опытного эксперта.
📌 Формат: онлайн-собеседование (~1.5 часа + обратная связь).
📌 Что разберем: реализацию фичи (практика), многопоточность, Coroutines, Flow, Java/Kotlin, платформу и библиотеки + теоретические вопросы, разбор кода (без лайвкодинга и System Design).
👨💻 Кто нужен: Android-разработчик Middle+ с 2+ годами коммерческого опыта, знанием Kotlin Coroutines, Kotlin Flow (Jetpack Compose — плюс).
👨💻 Собеседующий: Александр Гирев, Senior Android Developer в Wildberries, провел 150+ интервью, спикер Mobius-2024, автор статей на Хабр.
📅 Заявки принимаются до 23:59 (GMT+3) 2 марта по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥37👍13👎5
C 20 февраля 2025 больше не принимаются новые публикации от разработчиков
Обновления приложений можно загружать до 20 августа 2025
20 августа 2025 прекращается поддержка магазина на Android устройствах, но продолжит работать на Fire TV и Fire Tablet
Amazon Appstore был запущен 22 марта 2011 года
#android #amazon
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉27🤯12👎8👍3🔥2
Qualcomm продлевают поддержку Android до 8 лет!
Новая инициатива Qualcomm и Google позволит устройствам на Snapdragon 8 Elite и будущих чипах получать обновления Android и патчи безопасности в течение 8 лет. Это огромный шаг вперёд для Android-экосистемы, повышая долговечность устройств и снижая затраты для OEM-производителей.
Какие устройства получат поддержку?
👉 Смартфоны на Snapdragon 8 Elite с Android 15
👉 Будущие устройства на новых Snapdragon 8 и 7-й серии
👉 Включает 2 обновления ядра Android Common Kernel
Однако финальное решение остаётся за производителями. Будут ли OEM-ы действительно поддерживать свои устройства так долго? Samsung уже делает 7 лет, Google столько же, но у них свои чипы.
#Android #Qualcomm #Snapdragon
Новая инициатива Qualcomm и Google позволит устройствам на Snapdragon 8 Elite и будущих чипах получать обновления Android и патчи безопасности в течение 8 лет. Это огромный шаг вперёд для Android-экосистемы, повышая долговечность устройств и снижая затраты для OEM-производителей.
Какие устройства получат поддержку?
👉 Смартфоны на Snapdragon 8 Elite с Android 15
👉 Будущие устройства на новых Snapdragon 8 и 7-й серии
👉 Включает 2 обновления ядра Android Common Kernel
Однако финальное решение остаётся за производителями. Будут ли OEM-ы действительно поддерживать свои устройства так долго? Samsung уже делает 7 лет, Google столько же, но у них свои чипы.
#Android #Qualcomm #Snapdragon
🔥29👍17👎4
Еще раз(EN,5м, без VPN) про ограничение публикации Android приложений в Google Play с разрешением READ_MEDIA_IMAGES - доступ ко всем картинкам пользователя на устройстве
Кому разрешено его использовать:
1️⃣ Приложениям галереям
2️⃣ Приложения по редактированию фото
3️⃣ Социальным сетям с функциями шаринга фото (Instagram и Facebook попадают сюда)
Как по мне, фото редакторы и шаринг фото прекрасно может обходиться на выборе фото через Photo Picker без каких либо проблем, а вот пользователям будет безопаснее. Photo Picker - прекрасное решение. Только сделайте его работу стабильным и добавьте поддержку добавления других облаков кроме Google Photos
* Meta, Instagram и Facebook являются экстремистскими организациями и запрещены на территории РФ
#android #googleplay #безопасность
Кому разрешено его использовать:
Как по мне, фото редакторы и шаринг фото прекрасно может обходиться на выборе фото через Photo Picker без каких либо проблем, а вот пользователям будет безопаснее. Photo Picker - прекрасное решение. Только сделайте его работу стабильным и добавьте поддержку добавления других облаков кроме Google Photos
* Meta, Instagram и Facebook являются экстремистскими организациями и запрещены на территории РФ
#android #googleplay #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👎19👍15
Media is too big
VIEW IN TELEGRAM
Очень классное видео про то как подходить к разработке приложений без привязки к экрану, а думать именно в терминах пространства для отрисовки
0:00 Введение
4:15 Зачем создавать адаптивные интерфейсы?
7:49 Адаптивность в Compose Material 3
13:01 Создание UI с Compose Material 3 Adaptive
22:07 Положения складных устройств
23:32 Анти-паттерны
26:52 Ввод, выходящий за рамки сенсорного управления
30:36 Тестирование на разных устройствах
36:17 Адаптивный рабочий процесс
39:29 Обратная связь и заключительные замечания
#android #material #большикэкраны
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍4👎4👏2
Forwarded from Surf Mobile Team
Хабр
Как оживает смартфон: Android на старте
Наши с вами телефоны включались бессчётное количество раз. Возможно, вы прямо сейчас запустили смартфон, чтобы прочитать эту статью. Ну а для тех, кто занимается разработкой, процесс включения...
Как оживает смартфон: Android на старте 🚀📱
Когда ты включаешь телефон, задумывался ли ты, что происходит внутри? Давай заглянем за кулисы и вместе с Артёмом, Android-разработчиком разберёмся, как запускается система и что скрывается под её капотом.
Для тех, кто работает с мобильными технологиями, этот процесс — не просто рутина. Какие этапы преодолевает система от нажатия кнопки включения до появления интерфейса? И как устройство готовится к полноценной работе? Понимание этого процесса критически важно для оптимизации приложений и повышения их производительности.
🔎 Читай статью от сёрфера и узнай:
🟢 Как Boot ROM подготавливает устройство к загрузке
🟢 Как ядро Linux управляет системой и влияет на её стабильность
🟢 Почему Zygote и System Server так важны для Android
Статья уже на Хабре! А насколько важны эти знания для каждого, кто работает с мобильными платформами — обсудим в комментариях 👇
#Surf #Android #Разработка
Когда ты включаешь телефон, задумывался ли ты, что происходит внутри? Давай заглянем за кулисы и вместе с Артёмом, Android-разработчиком разберёмся, как запускается система и что скрывается под её капотом.
Для тех, кто работает с мобильными технологиями, этот процесс — не просто рутина. Какие этапы преодолевает система от нажатия кнопки включения до появления интерфейса? И как устройство готовится к полноценной работе? Понимание этого процесса критически важно для оптимизации приложений и повышения их производительности.
🔎 Читай статью от сёрфера и узнай:
Статья уже на Хабре! А насколько важны эти знания для каждого, кто работает с мобильными платформами — обсудим в комментариях 👇
#Surf #Android #Разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27👎8🔥6