Реализация Picture-in-Picture режима для Android-приложения

Видео и трансляции в вашем приложении сворачиваются вместе с окном — пользователь теряет контент, а вы теряете его внимание. Мы настраиваем режим «картинка в картинке» под ключ: от проектирования до проверки на реальных устройствах. Внедрение сокращает число сбоев при сворачивании и ускоряет выпуск обновления.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация Picture-in-Picture режима для Android-приложения
Средний
~2-3 дня
Часто задаваемые вопросы

Почему Picture-in-Picture Android ломается на реальных устройствах

Picture-in-Picture Android перестаёт работать там, где заканчивается эмулятор и начинается живое устройство: окно не появляется при сворачивании приложения, звук обрывается через пару секунд, а после возврата из режима картинка в картинке интерфейс открывается заново и теряет состояние плеера. На стенде всё воспроизводится стабильно, у пользователя — нет, и это самая дорогая категория дефектов: воспроизводимость почти нулевая, а жалобы приходят без логов.

Причина в том, что режим картинка в картинке — это не «включить флаг», а договор между приложением и системой. Устройство решает, разрешить ли переход, когда у него хватает ресурсов и не блокирует ли политика производителя; система может отклонить вход, если активность не готова к смене конфигурации; а фоновое воспроизведение живёт отдельно от окна и требует собственной службы, иначе звук умирает вместе с интерфейсом. Разные оболочки производителей трактуют эти правила по-своему — отсюда «PiP не запускается» на одних моделях и работает на других.

Цена такого сбоя выше, чем кажется. Пользователь сворачивает приложение именно чтобы продолжать слушать или смотреть — если окно не появилось или пропал звук, сценарий рвётся, и человек уходит к конкуренту, который этот сценарий держит. При этом сам дефект не виден в отчётах о падениях: приложение не падает, оно просто ведёт себя не так, как ожидалось.

Разбираем, как это закрывается: где именно теряется переход в режим картинка в картинке, почему отваливается фоновое воспроизведение и какие проверки отделяют рабочий сценарий от «работает у меня на телефоне».

Что даёт корректно настроенный режим «картинка в картинке»

Непрерывность воспроизведения при сворачивании

Ключевая метрика — доля сессий, в которых видео продолжает играть после ухода приложения в фон. На стандартном onPause() плеер останавливается, и пользователь теряет позицию; при корректной настройке Picture-in-Picture активность переходит в onStop(), а не уничтожается, и воспроизведение идёт без разрыва. По нашей практике это поднимает удержание сессии просмотра в 1,5–2 раза: пользователь сворачивает приложение, чтобы ответить в мессенджере, и возвращается на ту же секунду.

Стабильность окна и управление жизненным циклом

PiP-окно живёт в отдельной задаче системы, поэтому его поведение определяется тем, как приложение обрабатывает onPictureInPictureModeChanged() и onUserLeaveHint(). Если не переключить разметку на компактную и не отвязать тяжёлые вью от жизненного цикла, окно схлопывается или показывает чёрный кадр. Мы разделяем UI на два состояния — полный экран и компактный набор контролов (play/pause, перемотка), — и окно остаётся управляемым на любом размере.

Вариант реализации Когда подходит Ограничения
Activity в PiP (enterPictureInPictureMode) Видео, звонки, трансляции внутри одного экрана Требует ручного управления разметкой и жизненным циклом
Отдельный сервис воспроизведения Фоновое аудио и видео с уведомлением Нет системного окна, только уведомление-контрол
PiP поверх другого приложения Мультизадачность: чат + видео одновременно Зависит от поддержки производителем устройства

Что это даёт в цифрах

После перевода плеера на единый жизненный цикл с обработкой PiP-переходов доля отказов при сворачивании падает с ~15% до единиц процентов, а число повторных запусков приложения снижается — пользователю не нужно заново искать контент. Мы проверяем сценарии на разных прошивках, потому что поведение окна отличается между оболочками производителей.

Android Picture-in-Picture — системный режим, который мы настраиваем под конкретный сценарий просмотра, а не включаем «как есть».

Этапы внедрения режима «картинка в картинке» в приложение

Внедрение Picture-in-Picture Android начинается не с кода, а с аудита: смотрим, как приложение ведёт себя при сворачивании и блокировке экрана, где теряется состояние плеера, какие экраны используют один и тот же видеоконтейнер. На этом этапе фиксируем целевые сценарии — фоновое воспроизведение, переход между разделами, ответ на звонок — и определяем, какие из них ломаются сейчас. Дальше выстраиваем работу по этапам, чтобы изменения не задели остальную логику.

  1. Аудит приложения. Разбираем текущий жизненный цикл экранов с видео, точки потери фокуса и повторной инициализации плеера. Фиксируем, какие состояния нужно сохранять при переходе в PiP и обратно.
  2. Проектирование поведения окна. Определяем пропорции, реакцию на перетаскивание и закрытие, набор доступных действий в свёрнутом режиме. Согласуем, что происходит при возврате в полный экран.
  3. Настройка жизненного цикла. Связываем переход в PiP с событиями активности, чтобы воспроизведение не прерывалось и позиция не сбрасывалась. Отдельно прорабатываем конфликт с другими окнами поверх приложения.
  4. Реализация и интеграция с плеером. Подключаем режим к видеоконтейнеру, синхронизируем состояние звука, субтитров и выбранного качества при сворачивании и разворачивании.
  5. Тестирование сворачивания. Прогоняем сценарии на разных версиях системы и размерах экрана: свёртывание во время буферизации, при заблокированном экране, при входящем звонке. Проверяем, что окно не перекрывает системные элементы.
  6. Проверка на реальных устройствах. Отдельно смотрим поведение на бюджетных моделях и планшетах — там чаще проявляются расхождения в отрисовке и потреблении ресурсов.
  7. Передача конфигурации. Отдаём команде заказчика настройки окна, описание жизненного цикла и чеклист проверок, чтобы дальнейшие правки не ломали режим.

Каждый этап закрывается результатом, который можно проверить: сохранённое состояние плеера, отсутствие разрывов воспроизведения, предсказуемое поведение окна. Такой порядок позволяет встроить режим без переписывания существующей логики экранов. Опишите задачу — вернёмся с оценкой и планом по вашему приложению.

Чем отличается системный режим PiP от собственного плавающего окна?

Системный Picture-in-Picture Android — это режим, который целиком обслуживает операционная система: приложение лишь сообщает, что готово свернуться в окно, передаёт набор действий и получает колбэки о смене состояния. Окно живёт поверх других задач, его положение, размер, жесты перетаскивания и закрытия контролирует система, а наше приложение продолжает работать в фоне без потери контекста воспроизведения.

Собственное плавающее окно — это отдельный слой поверх интерфейса, который рисует само приложение: мы сами держим координаты, обрабатываем перетаскивание, следим за жизненным циклом активити и вручную возвращаем пользователя в полноэкранный режим.

Разница в трудозатратах проявляется сразу. Системный PiP — это несколько дней работы: объявить поддержку в манифесте, описать действия, аккуратно обработать переходы между полноэкранным и свёрнутым состоянием, чтобы не сбрасывалась позиция воспроизведения. Собственное окно — это уже отдельная подсистема: слой поверх всех экранов, свои жесты, конфликты с системными панелями, ручное управление фокусом и отдельная логика сворачивания. Такое окно приходится сопровождать при каждом обновлении системы, потому что поведение разрешений и оверлеев меняется от версии к версии.

Совместимость версий — второй водораздел. Системный режим доступен начиная с определённой ветки Android и на всех актуальных устройствах ведёт себя предсказуемо: система сама решает, как расположить окно и как реагировать на поворот экрана. Собственное окно формально работает везде, но именно на этом «везде» и начинается боль: на одних прошивках оверлей перекрывает системные элементы, на других — теряет фокус, на третьих — выгружается при нехватке памяти. Каждое отклонение — это отдельный баг-репорт и отдельная правка.

Поведение на разных версиях системы тоже расходится. Системный PiP наследует политики энергосбережения и корректно уходит в фон, не рискуя быть убитым. Собственное окно живёт в процессе приложения и разделяет его судьбу: стоит системе освободить память — окно исчезает вместе с ним. Для сценариев вроде видеозвонка или плеера это критично: пользователь ждёт, что картинка останется на месте.

Практический вывод простой. Если задача — видео, звонок или навигация, системный режим закрывает её меньшей ценой и с меньшим числом отказов. Собственное окно оправдано только там, где нужен нестандартный интерфейс поверх чужих приложений — например, свои элементы управления вне системных ограничений. Опишите сценарий — вернёмся с оценкой и планом по каждому из подходов.

Кейс: как режим «картинка в картинке» перестал сбоить при сворачивании

Заказчик — сервис доставки — жаловался не на отсутствие режима, а на его нестабильность: при сворачивании приложение то продолжало показывать видео поверх других окон, то полностью останавливало воспроизведение. По логам доля успешных сворачиваний держалась на уровне 78%, а восстановление после возврата в приложение занимало до 4 секунд — пользователь успевал потерять контекст и закрывал сессию.

Что было до внедрения

Разбор показал три независимых источника отказов. Первый — активность не переводилась в нужный режим жизненного цикла: система не получала корректного перехода, и окно «картинка в картинке» либо не появлялось, либо перекрывало системные элементы. Второй — состояние плеера не сохранялось при сворачивании, поэтому после возврата воспроизведение начиналось с нуля. Третий — обработка жестов и кнопок управления конфликтовала с системным окном, из-за чего часть действий просто игнорировалась.

Что изменили

Мы перевели управление окном на явные вызовы системного интерфейса с корректной настройкой пропорций и границ, добавили сохранение позиции воспроизведения и буфера перед сворачиванием и восстановление из этого состояния при возврате. Отдельно синхронизировали обработчики управления с состоянием системного окна, чтобы действия не терялись. Для контроля добавили телеметрию по каждому переходу — теперь отказ виден на конкретном шаге, а не «где-то при сворачивании».

Что стало

Метрика До После
Доля успешных сворачиваний 78% 99,2%
Время восстановления после возврата до 4 с менее 0,5 с
Обращения в поддержку по режиму регулярные единичные

Класс отказов, связанный с потерей состояния плеера, устранён полностью — воспроизведение продолжается с той же секунды. Оставшиеся единичные случаи относятся к устройствам с агрессивной экономией энергии и закрываются настройкой исключений.

Логику перехода и восстановления мы выстроили по модели жизненного цикла Android, поэтому поведение предсказуемо на разных оболочках. Если у вас режим «картинка в картинке» работает через раз — опишите задачу, вернёмся с оценкой и планом.

Сомнения перед внедрением: совместимость, откат и доступы

Перед включением Picture-in-Picture в релиз обычно всплывают три вопроса: не сломает ли режим поведение на старых устройствах, можно ли откатить изменение точечно и что именно останется у команды заказчика после сдачи. Ниже — как мы закрываем каждый из них на уровне кода и процесса, а не обещаний.

Что если PiP конфликтует с текущими экранами? Режим включается атрибутом supportsPictureInPicture в манифесте и setAutoEnterEnabled в PictureInPictureParams — то есть управляется точечно на уровне активити, а не всего приложения. Экраны, где PiP не нужен (онбординг, оплата, видео-звонки с собственным оверлеем), просто не помечаются, и их поведение не меняется. Для устройств без поддержки режима оставляем проверку hasSystemFeature и штатный фолбэк — свёрнутое воспроизведение останавливается, приложение работает как раньше.

Как откатывается изменение? PiP изолирован в отдельном модуле и feature-флаге: выключение флага возвращает прежнее поведение без пересборки логики экранов. Откат — это revert одного коммита или смена значения флага на стороне конфигурации, время восстановления — минуты, а не релизный цикл.

Что входит в передачу после сдачи?

На руки заказчик получает: исходный код PiP-модуля с историей коммитов; конфигурацию feature-флага и инструкцию по его переключению; схему жизненного цикла активити в режиме PiP; описание поддерживаемых версий Android и матрицу устройств, на которых режим проверен; чеклист регрессии по экранам; доступы к репозиторию и CI с правами на сборку и откат.

  • Исходный код модуля с чистой историей коммитов и описанием изменений
  • Конфигурация feature-флага и порядок его включения/выключения
  • Схема жизненного цикла активити и переходов в PiP и обратно
  • Матрица совместимости: версии Android и протестированные устройства
  • Чеклист регрессии по затронутым экранам
  • Доступы к репозиторию, CI и права на откат релиза
  • Инструкция по передаче поддержки внутренней команде

Опишите вашу задачу — вернёмся с оценкой объёма, планом внедрения и списком того, что потребуется с вашей стороны для доступов.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1009
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    902
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1331
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1179
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1106
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    713