Спасибо за видео, но есть небольшое дополнение: Если не подключите также androidx.fragment:fragment-ktx:1.3.1, то в некоторых кейсах будет ошибка "java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode"
В чем именно оно увеличилось? Раньше оно было рассредоточено по куче мест, а вот сейчас четко описывается все в одном месте + легко вынести за пределы. Гибкость не может обеспечится меньшим количеством кода, а вот её результат позволяет масштабировать приложение и разделять ответственность
TakeAudio достаточно легко создал. А вот ДНД, АдминМод, Батарею и другие системные интенты очень хотелось бы все же видеть универсально. Там на каждой ОС куча подводных камней
@@AndroidBroadcast Например как выстраивать правильно структуру с запросом permissions с диалоговыми окнами.(куда их можно попрятать, чтобы не было так грамостко) В какой момент срабатывает shouldShowRequestPrmissionRationale и как правильно его зациклить с сообщением разрешения. (а главное где, в колбеке ответа или перед запросом разрешения)
Жалко что register нельзя вызывать после создания фрагмента, описание коллбека в конкретном кейсе явно покрасивее будет. Да и с именами придётся немного повозится, если больше одного фото на экране, то будет pickPhotoForFirstContainer, pickPhotoForSecondContainer. Ну и тупо получается: ResultLauncher называется requestCameraPermissions, а передавать какие именно пермишены надо запросить, всё равно приходится при запуске.
@@AndroidBroadcast Увы, но нет IllegalStateException: Fragment is attempting to registerForActivityResult after being created. Fragments must call registerForActivityResult() before they are created (i.e. initialization, onAttach(), or onCreate()).
@@AndroidBroadcast достаточно в onResume вызвать register. Если вызывать в onCreated, то ещё будет работать нормально. Прчём сам register отрабатывает нормально, падает при launch override fun onResume() { super.onResume() registerForActivityResult(ActivityResultContracts.GetContent()) { }.launch(MIMETYPE_IMAGES) }
В эту часть еще не копал, но однозначно хотел посмотреть. Помню свои страдания по этим проблемам и куче костылей вокруг. Расскажу об этом во вторйо части.
💰 Поддержать проект bit.ly/3sratqQ
📰 Android Broadcast Telegram ttttt.me/android_broadcast
🔗 Блог о жизни канала boosty.to/androidbroadcast
Очень полезно и лаконично! Спасибо за твой труд
Спасибо за видео! Коммент не только для благодарности, но и для алгоритма ютуба ;)
спасмбо !
Благодарю за видео. Надо попробовать на своих проектах.
Очень круто спасибо. Сейчас попробую на нашем приложении!
Спасибо за видео, но есть небольшое дополнение: Если не подключите также androidx.fragment:fragment-ktx:1.3.1, то в некоторых кейсах будет ошибка "java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode"
Ага, важное замечание. Я уже забыл что всегда все зависимости подключаю руками
СПАСИБО ТЕБЕ, ДОБРЫЙ ЧЕЛОВЕК! Я второй день с этой херней сижу, не понимаю, почему прилетает такой requestcode
Спасибо за видео! Отличное api, тот редкий случай, когда гугл сделал что-то действительно удобное.
Скорее обертка над тем что изначально сделали неудобным. Идея плодить кучу Callback в стандартных компонентах приложения ужасная
Отличный выпуск. Все хотел разобраться с новым подходом, да вот руки не доходили)
А тут все разжёвано как надо)
Спасибо Кирилл.
Спасибо. Формат классный, но что касается темы , плюс вижу только в выносе в сторонние классы, но количество кода увеличилось.
В чем именно оно увеличилось? Раньше оно было рассредоточено по куче мест, а вот сейчас четко описывается все в одном месте + легко вынести за пределы. Гибкость не может обеспечится меньшим количеством кода, а вот её результат позволяет масштабировать приложение и разделять ответственность
В activity-ktx есть экстеншены ActivityResultLauncher.launch() ActivityResultLauncher.launch() для того чтобы не передавать null
Супер, я это упустил
Спасибо. Кратко и по делу. А кстати какой контракт используется для работы с смс?
Все контракты в Jetpack можно найти в подклассах в доках по d.android.com/reference/androidx/activity/result/contract/ActivityResultContract
15:07 А откуда взялась константа EXTRA_MESSAGE ? где она находится ?
Это строковая константа, которая объявлена в приложении для передачи данных
Великолепно! Спасибо.
Спасибо
TakeAudio достаточно легко создал. А вот ДНД, АдминМод, Батарею и другие системные интенты очень хотелось бы все же видеть универсально. Там на каждой ОС куча подводных камней
Разве они тоже имеют отношения к Activity Result API ?
Спасибо!
Спасибо , а вторая часть когда будет?
Уже есть на канале ruclips.net/video/Z9YKPwuy2Kc/видео.html
а как настроить скобки в блоке разными цветами? полезная штука)
plugins.jetbrains.com/plugin/10080-rainbow-brackets
А в коллбэке для пермишенов как-то можно будет понять, что юзер выбрал "не спрашивать больше"?
Нет, там только приходит получено разрешение или нет. Делать все проверки касательно "не спрашивать больше" придется самостоятельно
полезно) спасибо)
Топчик!
А как у вас скобки такие разноцветные?) Это плагин какой то или студия умеет так выделять?
Это плагин plugins.jetbrains.com/plugin/10080-rainbow-brackets
@@AndroidBroadcast Спасибо
Жаль про рантайм разрешения мало рассказал.
Так а что там рассказывать? Я же показал как их теперь запрашивать
@@AndroidBroadcast Например как выстраивать правильно структуру с запросом permissions с диалоговыми окнами.(куда их можно попрятать, чтобы не было так грамостко) В какой момент срабатывает shouldShowRequestPrmissionRationale и как правильно его зациклить с сообщением разрешения. (а главное где, в колбеке ответа или перед запросом разрешения)
Так это уже не про Activity Result API, а про работу с разрешениями. Тема выходит за рамки видео
А что произойдет, если во время выбора картинки система закроет нашу активити? Сработает ли колбек в новой активити?
Подробности такого поведения будут во второй части
Жалко что register нельзя вызывать после создания фрагмента, описание коллбека в конкретном кейсе явно покрасивее будет. Да и с именами придётся немного повозится, если больше одного фото на экране, то будет pickPhotoForFirstContainer, pickPhotoForSecondContainer.
Ну и тупо получается: ResultLauncher называется requestCameraPermissions, а передавать какие именно пермишены надо запросить, всё равно приходится при запуске.
Почему нельзя? Это же обычный метод, который позволяет зарегистрировать Callback в любое время
@@AndroidBroadcast Увы, но нет IllegalStateException: Fragment is attempting to registerForActivityResult after being created. Fragments must call registerForActivityResult() before they are created (i.e. initialization, onAttach(), or onCreate()).
Очень странно с чем это связано, надо будет посмотреть. Спасибо
Можно код Fragment где воспроизводится проблема?
@@AndroidBroadcast достаточно в onResume вызвать register. Если вызывать в onCreated, то ещё будет работать нормально. Прчём сам register отрабатывает нормально, падает при launch
override fun onResume() {
super.onResume()
registerForActivityResult(ActivityResultContracts.GetContent()) {
}.launch(MIMETYPE_IMAGES)
}
Если честно, я подумал, что на заставке ты в смирительной рубашке стоишь 😬
Могло бы получиться интересно
Ещё эта штука спасает при process death
В эту часть еще не копал, но однозначно хотел посмотреть. Помню свои страдания по этим проблемам и куче костылей вокруг. Расскажу об этом во вторйо части.
А как поставить два лайка?
Бери телефон соседа/соседки!
Ничего не понимаю 😢😢😢 ну вы поняли, что я чайник, да?😘
+
17:18 ???
Что?
Кусок был вырезан, этот хвостик тоже скоро пропадет