Імплементація Chromecast-стрімінгу з мобільного застосунку
Chromecast працює через Google Cast SDK: телефон (Sender) керує пристроєм відтворення (Receiver — Chromecast, Android TV, Google Nest). Телефон не стрімить медіа-дані через себе — він відправляє URL, а Receiver сам тягне потік прямо з сервера.
Підключення Google Cast SDK
Android. com.google.android.gms:play-services-cast-framework:latest в build.gradle. Ініціалізація в Application:
class App : Application() {
override fun onCreate() {
super.onCreate()
val options = CastOptions.Builder()
.setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.build()
CastContext.getSharedInstance(this, executor).addOnSuccessListener { castContext ->
// Cast контекст готовий
}
}
}
DEFAULT_MEDIA_RECEIVER_APPLICATION_ID — стандартний Default Media Receiver, програє HLS, DASH, MP4, MP3. Для кастомного Receiver (власне веб-застосунку на Chromecast) — реєструємо в Google Cast Developer Console і використовуємо власний App ID.
iOS. pod 'google-cast-sdk' (CocoaPods) або GoogleCast через SPM (неофіційний). API аналогічно Android.
Кнопка Cast в UI
Google Cast SDK автоматично надає UICastButton (iOS) / MediaRouteButton (Android) — стандартна іконка Cast, яка показує список доступних пристроїв та змінює вигляд при підключенні:
// У меню toolbar
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_player, menu)
CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.media_route_menu_item)
return true
}
Для Jetpack Compose — AndroidView з MediaRouteButton.
Запуск відтворення на Receiver
val castSession = CastContext.getSharedInstance(context).sessionManager.currentCastSession
val remoteClient = castSession?.remoteMediaClient ?: return
val mediaMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE).apply {
putString(MediaMetadata.KEY_TITLE, "Назва фільму")
putString(MediaMetadata.KEY_SUBTITLE, "Опис")
addImage(WebImage(Uri.parse(thumbnailUrl)))
}
val mediaInfo = MediaInfo.Builder(streamUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType("application/x-mpegURL") // HLS, або video/mp4 для MP4
.setMetadata(mediaMetadata)
.build()
val loadOptions = MediaLoadRequestData.Builder()
.setMediaInfo(mediaInfo)
.setAutoplay(true)
.setCurrentTime(startPositionMs.toLong())
.build()
remoteClient.load(loadOptions)
Управління відтворенням
RemoteMediaClient — центральний об'єкт для всіх команд: play(), pause(), seek(position), setStreamVolume(volume). Стан — через RemoteMediaClient.Callback:
remoteClient.registerCallback(object : RemoteMediaClient.Callback() {
override fun onStatusUpdated() {
val status = remoteClient.mediaStatus ?: return
val position = status.streamPosition
val isPlaying = status.playerState == MediaStatus.PLAYER_STATE_PLAYING
updateUI(isPlaying, position)
}
})
Mini Controller та Expanded Controller
Google Cast SDK надає готові UI-компоненти: MiniControllerFragment — смужка управління внизу екрана (аналог мініплеєра), ExpandedControllerActivity — повноекранний кастовий плеєр. Підключаються декларативно — мінімум коду.
Сесія Cast та переподключення
При втраті Wi-Fi з'єднання CastSession переходить в стан TEMPORARILY_DISCONNECTED. Через 3 хвилини — DISCONNECTED. SessionManagerListener.onSessionSuspended / onSessionResumed — обробляємо переподключення, відновлюємо відтворення з збереженої позиції.
Якщо користувач закрив застосунок і повернувся — Cast SDK автоматично відновлює сесію через CastContext.sessionManager.currentCastSession. Перевіряємо при запуску застосунку і показуємо кастовий міні-контроллер якщо сесія активна.
Chromecast на React Native та Flutter
React Native: react-native-google-cast (github.com/react-native-google-cast) — неофіційний враппер. Стабільний для базових сценаріїв (запуск відео, пауза, перемотка), але розширена функціональність (черга, кастомні дані) вимагає нативного коду через bridge.
Flutter: офіційного пакету немає. flutter_google_cast (pub.dev) — community-пакет, підтримка нестійка. Для production рекомендуємо нативну реалізацію через MethodChannel.
Строки
Базовий Chromecast-стрімінг з кнопкою Cast, запуском відтворення та міні-контроллером — 2–3 дні. Кастомний Receiver-приймач (веб-застосунок) — окрема задача, плюс 2–3 дні.







