Реализация управления воспроизведением через Lock Screen и Control Center

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация управления воспроизведением через Lock Screen и Control Center
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    760
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    646
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1056
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    878
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    450

Реализация управления воспроизведением через Lock Screen и Control Center

Медиаконтролы на экране блокировки — не опциональная фича, а стандарт ожидания для любого медиаплеера. Без них пользователь вынужден разблокировать телефон, найти приложение и нажать паузу вместо того, чтобы сделать это в одно касание прямо на Lock Screen.

iOS: MPNowPlayingInfoCenter и MPRemoteCommandCenter

Два независимых объекта: первый отвечает за метаданные (что показывать), второй — за команды (что делать при нажатии кнопок).

// Метаданные
var nowPlayingInfo: [String: Any] = [:]
nowPlayingInfo[MPMediaItemPropertyTitle] = track.title
nowPlayingInfo[MPMediaItemPropertyArtist] = track.artist
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = track.duration
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate // 0.0 пауза, 1.0 игра

// Обложка — асинхронно загружаем изображение
let artwork = MPMediaItemArtwork(boundsSize: CGSize(width: 300, height: 300)) { size in
    return self.trackArtworkImage ?? UIImage(named: "placeholder")!
}
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork

MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

MPNowPlayingInfoPropertyElapsedPlaybackTime — текущая позиция в треке. Если не обновлять при поиске (seek), прогресс-бар на Lock Screen будет расходиться с реальностью. Обновляем после каждого seek и каждые 5–10 секунд через таймер.

// Команды
let commandCenter = MPRemoteCommandCenter.shared()

commandCenter.playCommand.addTarget { [weak self] _ in
    self?.player.play()
    return .success
}
commandCenter.pauseCommand.addTarget { [weak self] _ in
    self?.player.pause()
    return .success
}
commandCenter.nextTrackCommand.addTarget { [weak self] _ in
    self?.playNext()
    return .success
}
commandCenter.changePlaybackPositionCommand.isEnabled = true
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
    guard let e = event as? MPChangePlaybackPositionCommandEvent else { return .commandFailed }
    self?.player.seek(to: CMTime(seconds: e.positionTime, preferredTimescale: 600))
    return .success
}

changePlaybackPositionCommand — ползунок на Lock Screen. Без него пользователь не может перемотать, не открывая приложение.

Команды нужно включать/отключать по контексту: если в плейлисте один трек — commandCenter.nextTrackCommand.isEnabled = false.

Android: MediaSession и MediaNotification

val mediaSession = MediaSession.Builder(context, player)
    .setCallback(object : MediaSession.Callback {
        override fun onConnect(session: MediaSession, controller: MediaSession.ControllerInfo) =
            MediaSession.ConnectionResult.accept(
                SessionCommands.EMPTY,
                Player.Commands.Builder().addAllCommands().build()
            )
    })
    .build()

media3 автоматически создаёт уведомление с медиаконтролами при использовании MediaSessionService. Кастомизация кнопок через DefaultMediaNotificationProvider:

class CustomNotificationProvider(context: Context) : DefaultMediaNotificationProvider(context) {
    override fun getMediaButtons(
        session: MediaSession, playerCommands: Player.Commands,
        customLayout: ImmutableList<CommandButton>, showPauseButton: Boolean
    ): ImmutableList<CommandButton> {
        // Добавляем кнопку "Избранное" рядом с play/pause
        return super.getMediaButtons(session, playerCommands, customLayout, showPauseButton)
            .toMutableList().apply { add(favoriteButton) }.toImmutableList()
    }
}

На Android обложка в уведомлении: MediaMetadata.Builder().setArtworkUri(uri).build() — система сама загружает изображение по URI. Для избежания ANR при загрузке обложки через сеть — подгружаем через Coil или Glide в CoroutineScope(Dispatchers.IO), передаём готовый Bitmap через setArtworkData.

Flutter

audio_service (pub.dev) — стандартный пакет. Создаём AudioHandler, регистрируем в AudioService.init(). Обработчики команд: onPlay, onPause, onSkipToNext, onSeekTo. Метаданные — mediaItem в AudioHandler.

Сроки

Медиаконтролы на iOS — 1 день (весь объём — настройка двух объектов и обновление метаданных). Android с кастомным уведомлением — 1.5 дня. Flutter — 1–2 дня.