When a user taps the Cast button, content should instantly appear on the big screen. But implementing that button is far from trivial: integrating the Google Cast SDK, managing session state, handling connection loss, and controlling pause and seek. Devices must be on the same network, and the app must pass App Store Review Guidelines (Section 4.2). We handle this for you. Our team has 5+ years in mobile development and 15+ projects with Chromecast streaming. We use proven patterns and guarantee stable performance on Android and iOS. Our ready components reduce time-to-market by 30%, and using the Default Media Receiver can cut initial budget costs by up to 40%.
How to Implement Chromecast Streaming in 2–3 Days?
The fastest path is using the Default Media Receiver: the phone (Sender) sends a content URL, and the Receiver streams it directly—no custom web app needed. Playback control goes through the Google Cast SDK. Basic integration takes 2–3 days. For custom requirements (UI, DRM, analytics), we develop a custom Receiver, adding another 2–3 days. Development costs are up to 50% lower compared to doing it yourself.
Integrating the Google Cast SDK
Android. Add com.google.android.gms:play-services-cast-framework:latest to your build.gradle—the standard package for Chromecast on Android. Initialize in 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 context ready } } } DEFAULT_MEDIA_RECEIVER_APPLICATION_ID is the standard Default Media Receiver, which plays HLS, DASH, MP4, MP3. For a custom Receiver, register your app in the Google Cast Developer Console and use your own App ID. For more on CastContext setup, see the Google Cast documentation.
iOS. Add pod 'google-cast-sdk' or GoogleCast via SPM—the main SDK for Chromecast on iOS. The API is similar to Android.
Cast Button in the UI
The Google Cast SDK provides ready-made buttons: UICastButton (iOS) and MediaRouteButton (Android). They show device lists and change appearance when connected:
// In toolbar menu 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 } For Jetpack Compose, use AndroidView with MediaRouteButton.
Starting Playback on the 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, "Movie Title") putString(MediaMetadata.KEY_SUBTITLE, "Description") addImage(WebImage(Uri.parse(thumbnailUrl))) } val mediaInfo = MediaInfo.Builder(streamUrl) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType("application/x-mpegURL") // HLS, or video/mp4 for MP4 .setMetadata(mediaMetadata) .build() val loadOptions = MediaLoadRequestData.Builder() .setMediaInfo(mediaInfo) .setAutoplay(true) .setCurrentTime(startPositionMs.toLong()) .build() remoteClient.load(loadOptions) Playback Control
RemoteMediaClient is the central object for Chromecast playback: play(), pause(), seek(position), setStreamVolume(volume). Track state via a 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 and Expanded Controller
Built-in components: MiniControllerFragment—a bottom control bar, and ExpandedControllerActivity—a full-screen player. They work declaratively with minimal code and automatically reflect the Chromecast connection state.
Why Use a Custom Receiver?
The Default Receiver covers 80% of use cases. But if you need a unique interface, Subrip subtitles, analytics, or DRM (Widevine), a custom Receiver is essential. We build a web application in HTML5/JavaScript. A custom Receiver increases development time by 70% but gives full control—4 times more customization options than the Default.
| Feature | Default Receiver | Custom Receiver |
|---|---|---|
| Integration time | 2–3 days | 5–6 days |
| UI customization | Limited | Full control |
| DRM support | No | Yes (Widevine) |
| Analytics | No | Collect any metrics |
| Complexity | Minimal | Requires web development |
Key Integration Steps
| Step | Duration | Description |
|---|---|---|
| Requirements analysis | 1 day | Define content format, DRM, customization |
| Receiver choice | 0.5 day | Default or custom; register in Google Cast console |
| SDK integration | 1 day | Add dependencies, initialize CastContext |
| Cast button implementation | 0.5 day | Set up MediaRouteButton, handle sessions |
| Playback control | 1 day | Play/pause/seek via RemoteMediaClient |
| Testing | 1 day | On real devices (Chromecast, Android TV, Google Nest) |
| Deployment | 0.5 day | Publish to App Store and Google Play following policies |
Cast Session and Reconnection
When Wi-Fi is lost, CastSession enters TEMPORARILY_DISCONNECTED, then DISCONNECTED after 3 minutes. SessionManagerListener.onSessionSuspended / onSessionResumed handle reconnection; we resume playback from the saved position. On app return, the Cast SDK automatically restores the session via CastContext.sessionManager.currentCastSession.
Chromecast on React Native and Flutter
React Native: react-native-google-cast—an unofficial wrapper. It is stable for basic scenarios; advanced features require native code. Flutter: no official package; flutter_google_cast is unstable. For production, we recommend native implementation via MethodChannel. Native solutions are 2 times more reliable than cross-platform wrappers. TV casting from a WebView is also possible, but control is limited.
Additional Custom Receiver Capabilities
A custom Receiver allows you to add custom error handling, analytics integration (Google Analytics, Firebase), and support for non-standard formats (e.g., live streams with delay). See the official documentation for details.
What Is Included
- Google Cast SDK integration on Android (Kotlin) and iOS (Swift)
- Cast button and custom UI (MiniController, ExpandedController)
- Playback control (play/pause/seek/volume)
- Session handling, reconnection, position saving
- Testing on real devices (Chromecast, Android TV, Google Nest)
- Documentation and source code access
- Post-deployment support (1 month)
Timelines and Cost
Timelines range from 2 to 6 days. Cost is determined individually after an audit of your project. Contact us for a consultation and preliminary estimate. Order your Chromecast streaming solution—we guarantee stable performance on all devices. Get a consultation and ensure your TV casting works flawlessly.







