כאשר משתמש מקיש על כפתור ה-Cast, התוכן אמור להופיע מיד על המסך הגדול. אך יישום כפתור זה רחוק מלהיות טריוויאלי: שילוב Google Cast SDK, ניהול מצב הסשן, טיפול באובדן חיבור, ושליטה בהשהיה ובחיפוש. המכשירים חייבים להיות על אותה רשת, והאפליקציה חייבת לעמוד בהנחיות App Store Review Guidelines (סעיף 4.2). אנחנו מטפלים בזה עבורכם. לצוות שלנו יש ניסיון של 5+ שנים בפיתוח מובייל ו-15+ פרויקטים עם סטרימינג של Chromecast. אנו משתמשים בתבניות מוכחות ומבטיחים ביצועים יציבים על Android ו-iOS. הרכיבים המוכנים שלנו מקצרים את זמן היציאה לשוק ב-30%, ושימוש ב-Default Media Receiver יכול לקצץ בעלויות התקציב הראשוניות בעד 40%.
כיצד ליישם סטרימינג של Chromecast תוך 2–3 ימים?
הדרך המהירה ביותר היא שימוש ב-Default Media Receiver: הטלפון (Sender) שולח כתובת URL של תוכן, וה-Receiver מזרים אותו ישירות—ללא צורך באפליקציית web מותאמת אישית. בקרת ההפעלה עוברת דרך Google Cast SDK. אינטגרציה בסיסית אורכת 2–3 ימים. לדרישות מותאמות אישית (UI, DRM, אנליטיקה), אנו מפתחים Receiver מותאם אישית, ומוסיפים עוד 2–3 ימים. עלויות הפיתוח נמוכות בעד 50% בהשוואה לביצוע עצמי.
שילוב Google Cast SDK
Android. הוסיפו את com.google.android.gms:play-services-cast-framework:latest אל build.gradle—החבילה הסטנדרטית ל-Chromecast על Android. אתחלו בתוך 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 контекст готов
}
}
}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 הסטנדרטי, שמנגן HLS, DASH, MP4, MP3. עבור Receiver מותאם אישית, רשמו את האפליקציה שלכם ב-Google Cast Developer Console והשתמשו ב-App ID משלכם. למידע נוסף על הגדרת CastContext, ראו את תיעוד Google Cast.
iOS. הוסיפו את DEFAULT_MEDIA_RECEIVER_APPLICATION_ID או pod 'google-cast-sdk' דרך SPM—ה-SDK הראשי ל-Chromecast על iOS. ה-API דומה ל-Android.
כפתור Cast בממשק המשתמש
Google Cast SDK מספק כפתורים מוכנים: GoogleCast (iOS) ו-UICastButton (Android). הם מציגים רשימות מכשירים ומשנים את המראה כאשר הם מחוברים:
// В меню 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, השתמשו ב-MediaRouteButton עם // В меню 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 } .
התחלת הפעלה על ה-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) בקרת הפעלה
AndroidView הוא האובייקט המרכזי להפעלת Chromecast: MediaRouteButton, 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(). עקבו אחר המצב באמצעות 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
רכיבים מובנים: pause()—סרגל שליטה תחתון, ו-seek(position)—נגן במסך מלא. הם עובדים בצורה דקלרטיבית עם קוד מינימלי ומשקפים אוטומטית את מצב חיבור ה-Chromecast.
למה להשתמש ב-Receiver מותאם אישית?
ה-Default Receiver מכסה 80% ממקרי השימוש. אך אם אתם צריכים ממשק ייחודי, כתוביות Subrip, אנליטיקה או DRM (Widevine), Receiver מותאם אישית הוא חיוני. אנו בונים אפליקציית web ב-HTML5/JavaScript. Receiver מותאם אישית מגדיל את זמן הפיתוח ב-70% אך נותן שליטה מלאה—פי 4 יותר אפשרויות התאמה אישית מה-Default.
| תכונה | Default Receiver | Receiver מותאם אישית |
|---|---|---|
| זמן אינטגרציה | 2–3 ימים | 5–6 ימים |
| התאמת UI | מוגבלת | שליטה מלאה |
| תמיכת DRM | לא | כן (Widevine) |
| אנליטיקה | לא | איסוף כל מדד |
| מורכבות | מינימלית | דורש פיתוח web |
שלבי אינטגרציה מרכזיים
| שלב | משך | תיאור |
|---|---|---|
| ניתוח דרישות | יום אחד | הגדרת פורמט תוכן, DRM, התאמה אישית |
| בחירת Receiver | חצי יום | Default או מותאם אישית; רישום ב-Google Cast console |
| אינטגרציית SDK | יום אחד | הוספת תלויות, אתחול CastContext |
| יישום כפתור Cast | חצי יום | הגדרת MediaRouteButton, טיפול בסשנים |
| בקרת הפעלה | יום אחד | הפעלה/השהיה/חיפוש דרך RemoteMediaClient |
| בדיקות | יום אחד | על מכשירים אמיתיים (Chromecast, Android TV, Google Nest) |
| פריסה | חצי יום | פרסום ל-App Store ול-Google Play בהתאם למדיניות |
סשן Cast וחיבור מחדש
כאשר ה-Wi-Fi אובד, setStreamVolume(volume) נכנס למצב 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) } }) , ולאחר מכן MiniControllerFragment אחרי 3 דקות. ExpandedControllerActivity / CastSession מטפלים בחיבור מחדש; אנו מחדשים את ההפעלה מהמיקום השמור. בחזרה לאפליקציה, Cast SDK משחזר אוטומטית את הסשן דרך TEMPORARILY_DISCONNECTED.
Chromecast על React Native ו-Flutter
React Native: DISCONNECTED—wrapper לא רשמי. הוא יציב לתרחישים בסיסיים; תכונות מתקדמות דורשות קוד native. Flutter: אין חבילה רשמית; SessionManagerListener.onSessionSuspended אינו יציב. לייצור, אנו ממליצים על יישום native דרך onSessionResumed. פתרונות native אמינים פי 2 מ-wrapper חוצי פלטפורמות. שידור טלוויזיה מ-WebView אפשרי גם כן, אך השליטה מוגבלת.
יכולות נוספות של Receiver מותאם אישית
Receiver מותאם אישית מאפשר להוסיף טיפול בשגיאות מותאם אישית, אינטגרציית אנליטיקה (Google Analytics, Firebase), ותמיכה בפורמטים לא סטנדרטיים (למשל, שידורים חיים עם עיכוב). ראו את התיעוד הרשמי לפרטים.
מה כלול
- אינטגרציית Google Cast SDK על Android (Kotlin) ו-iOS (Swift)
- כפתור Cast ו-UI מותאם אישית (MiniController, ExpandedController)
- בקרת הפעלה (הפעלה/השהיה/חיפוש/עוצמת קול)
- ניהול סשנים, חיבור מחדש, שמירת מיקום
- בדיקות על מכשירים אמיתיים (Chromecast, Android TV, Google Nest)
- תיעוד וגישה לקוד המקור
- תמיכה לאחר פריסה (חודש אחד)
לוחות זמנים ועלות
לוחות הזמנים נעים בין 2 ל-6 ימים. העלות נקבעת באופן אישי לאחר בדיקת הפרויקט שלכם. צרו קשר לייעוץ והערכה מקדימה. הזמינו את פתרון הסטרימינג שלכם ל-Chromecast—אנו מבטיחים ביצועים יציבים על כל המכשירים. קבלו ייעוץ והבטיחו שהשידור לטלוויזיה שלכם יעבוד ללא תקלות.







