1. بررسی اجمالی
این کد لبه به شما میآموزد که چگونه یک برنامه Android TV موجود را تغییر دهید تا از ارسال و ارتباط از برنامههای فرستنده Cast موجود شما پشتیبانی کند.
Google Cast و Cast Connect چیست؟
Google Cast به کاربران امکان می دهد محتوا را از دستگاه تلفن همراه به تلویزیون ارسال کنند. یک جلسه معمولی Google Cast از دو جزء تشکیل شده است - یک برنامه فرستنده و یک برنامه گیرنده . برنامه های فرستنده، مانند یک برنامه تلفن همراه یا وب سایت مانند Youtube.com، پخش برنامه گیرنده Cast را آغاز و کنترل می کنند. برنامههای گیرنده Cast، برنامههای HTML 5 هستند که روی دستگاههای Chromecast و Android TV اجرا میشوند.
تقریباً تمام حالت در جلسه Cast در برنامه گیرنده ذخیره می شود. وقتی وضعیت بهروزرسانی میشود، برای مثال اگر یک آیتم رسانه جدید بارگیری شود، وضعیت رسانه برای همه فرستندهها پخش میشود. این پخشها شامل وضعیت فعلی جلسه Cast هستند. برنامه های فرستنده از این وضعیت رسانه برای نمایش اطلاعات پخش در رابط کاربری خود استفاده می کنند.
Cast Connect در بالای این زیرساخت قرار می گیرد و برنامه Android TV شما به عنوان گیرنده عمل می کند. کتابخانه Cast Connect به برنامه Android TV شما اجازه میدهد تا پیامها را دریافت کند و وضعیت رسانه را پخش کند، گویی یک برنامه گیرنده Cast است.
قرار است چه چیزی بسازیم؟
وقتی این کد لبه را تکمیل کردید، میتوانید از برنامههای فرستنده Cast برای ارسال ویدیو به برنامه Android TV استفاده کنید. برنامه Android TV همچنین می تواند از طریق پروتکل Cast با برنامه های فرستنده ارتباط برقرار کند.
چیزی که یاد خواهید گرفت
- نحوه افزودن کتابخانه Cast Connect به نمونه برنامه ATV.
- نحوه اتصال فرستنده Cast و راه اندازی برنامه ATV.
- نحوه شروع پخش رسانه در برنامه ATV از برنامه ارسال کننده Cast.
- نحوه ارسال وضعیت رسانه از برنامه ATV به برنامههای فرستنده Cast.
آنچه شما نیاز دارید
- جدیدترین Android SDK .
- جدیدترین اندروید استودیو . به طور خاص،
Chipmunk | 2021.2.1
یا نسخه های جدیدتر. - یک دستگاه Android TV که گزینههای برنامهنویس و اشکالزدایی USB را فعال کرده است.
- یک تلفن Android که گزینههای توسعهدهنده و اشکالزدایی USB را فعال کرده است.
- یک کابل داده USB برای اتصال تلفن Android و دستگاههای Android TV به رایانه برنامهنویس شما.
- دانش اولیه توسعه برنامه های اندروید با استفاده از Kotlin.
2. کد نمونه را دریافت کنید
می توانید تمام کدهای نمونه را در رایانه خود دانلود کنید ...
و فایل فشرده دانلود شده را باز کنید.
3. برنامه نمونه را اجرا کنید
ابتدا، بیایید ببینیم که برنامه نمونه تکمیل شده چگونه به نظر می رسد. برنامه Android TV از رابط کاربری Leanback و یک پخش کننده ویدیوی اصلی استفاده می کند. کاربر می تواند ویدیویی را از لیست انتخاب کند که پس از انتخاب در تلویزیون پخش می شود. با همراهی برنامه فرستنده تلفن همراه، کاربر میتواند ویدیویی را به برنامه Android TV ارسال کند.
ثبت دستگاه های توسعه دهنده
برای فعال کردن قابلیتهای Cast Connect برای توسعه برنامه، باید شماره سریال Chromecast داخلی دستگاه Android TV را که میخواهید در کنسول برنامهنویس Cast استفاده کنید، ثبت کنید. میتوانید شماره سریال را با رفتن به تنظیمات > تنظیمات برگزیده دستگاه > Chromecast داخلی > شماره سریال در تلویزیون Android خود پیدا کنید. توجه داشته باشید که این شماره با شماره سریال دستگاه فیزیکی شما متفاوت است و باید از روشی که در بالا توضیح داده شد به دست آید.
بدون ثبت نام، Cast Connect به دلایل امنیتی فقط برای برنامه های نصب شده از فروشگاه Google Play کار می کند. پس از 15 دقیقه از شروع فرآیند ثبت نام، دستگاه خود را مجددا راه اندازی کنید.
برنامه فرستنده اندروید را نصب کنید
برای آزمایش ارسال درخواستها از یک دستگاه تلفن همراه، ما یک برنامه فرستنده ساده به نام Cast Videos را به عنوان فایل mobile-sender-0629.apk
در کد منبع دانلود زیپ ارائه کردهایم. ما از ADB برای نصب APK استفاده خواهیم کرد. اگر قبلاً نسخه دیگری از Cast Videos را نصب کردهاید، لطفاً قبل از ادامه، آن نسخه را از تمام نمایههای موجود در دستگاه حذف نصب کنید.
- گزینه های توسعه دهنده و اشکال زدایی USB را در تلفن اندرویدی خود فعال کنید .
- یک کابل داده USB را وصل کنید تا تلفن Android خود را به رایانه توسعه متصل کنید.
-
mobile-sender-0629.apk
را روی گوشی اندرویدی خود نصب کنید.
- میتوانید برنامه فرستنده Cast Videos را در تلفن Android خود پیدا کنید.
برنامه Android TV را نصب کنید
دستورالعمل های زیر نحوه باز کردن و اجرای برنامه نمونه تکمیل شده در Android Studio را شرح می دهد:
- Import Project را در صفحه خوش آمدگویی یا گزینه های منو File > New > Import Project... را انتخاب کنید.
- را انتخاب کنید دایرکتوری
app-done
از پوشه کد نمونه و روی OK کلیک کنید. - روی فایل > کلیک کنید همگام سازی پروژه با فایل های Gradle .
- گزینه های برنامه نویس و اشکال زدایی USB را در دستگاه Android TV خود فعال کنید .
- ADB به دستگاه Android TV خود متصل شود، دستگاه باید در Android Studio نشان داده شود.
- را کلیک کنید دکمه Run ، باید بعد از چند ثانیه برنامه ATV با نام Cast Connect Codelab ظاهر شود.
بیایید Cast Connect را با برنامه ATV بازی کنیم
- به صفحه اصلی Android TV بروید.
- برنامه فرستنده Cast Videos را از تلفن Android خود باز کنید. روی دکمه Cast کلیک کنید و دستگاه ATV خود را انتخاب کنید.
- برنامه Cast Connect Codelab ATV در ATV شما راه اندازی می شود و دکمه Cast در فرستنده شما نشان می دهد که متصل است .
- یک ویدیو از برنامه ATV انتخاب کنید و ویدیو در ATV شما شروع به پخش می کند.
- اکنون در تلفن همراه شما، یک کنترلر کوچک در پایین برنامه فرستنده شما قابل مشاهده است. می توانید از دکمه پخش/مکث برای کنترل پخش استفاده کنید.
- یک ویدیو از تلفن همراه انتخاب کنید و پخش کنید. ویدیو در ATV شما شروع به پخش می کند و کنترلر گسترش یافته در فرستنده تلفن همراه شما نمایش داده می شود.
- تلفن خود را قفل کنید و وقتی قفل آن را باز می کنید، باید اعلانی را روی صفحه قفل مشاهده کنید تا پخش رسانه را کنترل کنید یا ارسال را متوقف کنید.
4. پروژه شروع را آماده کنید
اکنون که ادغام Cast Connect برنامه تکمیل شده را تأیید کردیم، باید پشتیبانی از Cast Connect را به برنامه شروعی که دانلود کردید اضافه کنیم. اکنون شما آماده هستید تا با استفاده از Android Studio روی پروژه شروع کننده ایجاد کنید:
- Import Project را در صفحه خوش آمدگویی یا گزینه های منو File > New > Import Project... را انتخاب کنید.
- را انتخاب کنید دایرکتوری
app-start
از پوشه کد نمونه و روی OK کلیک کنید. - روی فایل > کلیک کنید همگام سازی پروژه با فایل های Gradle .
- دستگاه ATV را انتخاب کرده و روی آن کلیک کنید دکمه اجرا برای اجرای برنامه و کاوش در رابط کاربری.
طراحی اپلیکیشن
این برنامه لیستی از ویدیوها را برای مرورگر در اختیار کاربر قرار می دهد. کاربران می توانند ویدیویی را برای پخش در Android TV انتخاب کنند. این برنامه از دو فعالیت اصلی تشکیل شده است: MainActivity
و PlaybackActivity
.
MainActivity
این فعالیت حاوی یک قطعه ( MainFragment
) است. لیست ویدیوها و ابرداده مربوط به آنها در کلاس MovieList
پیکربندی شده و متد setupMovies()
برای ساخت لیستی از اشیاء Movie
فراخوانی می شود.
یک شیء Movie
یک موجودیت ویدیویی را با عنوان، توضیحات، شست تصویر و آدرس ویدیو نشان می دهد. هر شیء Movie
به یک CardPresenter
متصل است تا تصویر کوچک ویدیو را با عنوان و استودیو ارائه کند و به ArrayObjectAdapter
ارسال شود.
هنگامی که یک مورد انتخاب می شود، شی Movie
مربوطه به PlaybackActivity
ارسال می شود.
PlaybackActivity
این فعالیت شامل یک قطعه ( PlaybackVideoFragment
) است که میزبان یک VideoView
با ExoPlayer
، برخی از کنترلهای رسانه، و یک ناحیه متنی برای نمایش توضیحات ویدیوی انتخابی است و به کاربر اجازه میدهد ویدیو را در Android TV پخش کند. کاربر می تواند از کنترل از راه دور برای پخش/مکث یا جستجوی پخش ویدیوها استفاده کند.
پیش نیازهای Cast Connect
Cast Connect از نسخههای جدید سرویسهای Google Play استفاده میکند که برای استفاده از فضای نام AndroidX باید برنامه ATV شما بهروزرسانی شده باشد.
برای پشتیبانی از Cast Connect در برنامه Android TV خود، باید رویدادها را از یک جلسه رسانه ایجاد و پشتیبانی کنید. کتابخانه Cast Connect وضعیت رسانه را بر اساس وضعیت جلسه رسانه ایجاد می کند. جلسه رسانه شما نیز توسط کتابخانه Cast Connect استفاده میشود تا زمانی که پیامهای خاصی را از فرستنده دریافت میکند، مانند مکث، سیگنال میدهد.
5. پیکربندی پشتیبانی Cast
وابستگی ها
فایل app build.gradle
را بهروزرسانی کنید تا وابستگیهای کتابخانه لازم را شامل شود:
dependencies {
....
// Cast Connect libraries
implementation 'com.google.android.gms:play-services-cast-tv:20.0.0'
implementation 'com.google.android.gms:play-services-cast:21.1.0'
}
پروژه را همگامسازی کنید تا ساختهای پروژه بدون خطا تأیید شود.
مقداردهی اولیه
CastReceiverContext
یک شی تک تنه برای هماهنگ کردن تمام تعاملات Cast است. شما باید رابط ReceiverOptionsProvider
را برای ارائه CastReceiverOptions
زمانی که CastReceiverContext
مقدار دهی اولیه می کند، پیاده سازی کنید.
فایل CastReceiverOptionsProvider.kt
را ایجاد کنید و کلاس زیر را به پروژه اضافه کنید:
package com.google.sample.cast.castconnect
import android.content.Context
import com.google.android.gms.cast.tv.ReceiverOptionsProvider
import com.google.android.gms.cast.tv.CastReceiverOptions
class CastReceiverOptionsProvider : ReceiverOptionsProvider {
override fun getOptions(context: Context): CastReceiverOptions {
return CastReceiverOptions.Builder(context)
.setStatusText("Cast Connect Codelab")
.build()
}
}
سپس ارائهدهنده گزینههای گیرنده را در تگ <application>
فایل AndroidManifest.xml
برنامه مشخص کنید:
<application>
...
<meta-data
android:name="com.google.android.gms.cast.tv.RECEIVER_OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.castconnect.CastReceiverOptionsProvider" />
</application>
برای ارتباط با برنامه ATV از فرستنده Cast، فعالیتی را که میخواهید راهاندازی کنید انتخاب کنید. در این کد لبه، هنگامی که جلسه Cast شروع می شود، MainActivity
برنامه را راه اندازی می کنیم. در فایل AndroidManifest.xml
، فیلتر intent راه اندازی را در MainActivity
اضافه کنید.
<activity android:name=".MainActivity">
...
<intent-filter>
<action android:name="com.google.android.gms.cast.tv.action.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
چرخه حیات زمینه گیرنده Cast
باید CastReceiverContext
را هنگامی که برنامه شما راه اندازی می شود راه اندازی کنید و زمانی که برنامه شما به پس زمینه منتقل می شود، CastReceiverContext
متوقف کنید. توصیه می کنیم از LifecycleObserver
از کتابخانه androidx.lifecycle برای مدیریت فراخوانی CastReceiverContext.start()
و CastReceiverContext.stop()
استفاده کنید.
فایل MyApplication.kt
را باز کنید، با فراخوانی initInstance()
در متد onCreate
برنامه، زمینه cast را مقداردهی کنید. در کلاس AppLifeCycleObserver
، هنگامی که برنامه از سر گرفته می شود، CastReceiverContext
start()
و زمانی که برنامه متوقف می شود stop()
:
package com.google.sample.cast.castconnect
import com.google.android.gms.cast.tv.CastReceiverContext
...
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
CastReceiverContext.initInstance(this)
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
class AppLifecycleObserver : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
Log.d(LOG_TAG, "onResume")
CastReceiverContext.getInstance().start()
}
override fun onPause(owner: LifecycleOwner) {
Log.d(LOG_TAG, "onPause")
CastReceiverContext.getInstance().stop()
}
}
}
اتصال MediaSession به MediaManager
MediaManager
یکی از ویژگی های CastReceiverContext
singleton است، وضعیت رسانه را مدیریت می کند، هدف بارگذاری را مدیریت می کند، پیام های فضای نام رسانه را از فرستنده ها به دستورات رسانه ای ترجمه می کند و وضعیت رسانه را به فرستنده ها برمی گرداند.
هنگامی که یک MediaSession
ایجاد می کنید، همچنین باید توکن MediaSession
فعلی را به MediaManager
ارائه دهید تا بداند دستورات را کجا ارسال کند و وضعیت پخش رسانه را بازیابی کند. در فایل PlaybackVideoFragment.kt
، مطمئن شوید که MediaSession
قبل از تنظیم توکن روی MediaManager
مقداردهی اولیه شده است.
import com.google.android.gms.cast.tv.CastReceiverContext
import com.google.android.gms.cast.tv.media.MediaManager
...
class PlaybackVideoFragment : VideoSupportFragment() {
private var castReceiverContext: CastReceiverContext? = null
...
private fun initializePlayer() {
if (mPlayer == null) {
...
mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager: MediaManager = castReceiverContext!!.getMediaManager()
mediaManager.setSessionCompatToken(mMediaSession!!.getSessionToken())
}
}
}
}
هنگامی که MediaSession
خود را به دلیل پخش غیرفعال منتشر می کنید، باید یک توکن null در MediaManager
تنظیم کنید:
private fun releasePlayer() {
mMediaSession?.release()
castReceiverContext?.mediaManager?.setSessionCompatToken(null)
...
}
بیایید برنامه نمونه را اجرا کنیم
را کلیک کنید دکمه اجرا برای استقرار برنامه در دستگاه ATV، برنامه را ببندید و به صفحه اصلی ATV بازگردید. از فرستنده خود، روی دکمه Cast کلیک کنید و دستگاه ATV خود را انتخاب کنید. خواهید دید که برنامه ATV در دستگاه ATV راه اندازی شده است و وضعیت دکمه Cast وصل شده است.
6. بارگذاری رسانه
دستور load از طریق یک intent با نام بسته ای که در کنسول توسعه دهنده تعریف کرده اید ارسال می شود. برای مشخص کردن فعالیت هدفی که این هدف را دریافت می کند، باید فیلتر هدف از پیش تعریف شده زیر را در برنامه Android TV خود اضافه کنید. در فایل AndroidManifest.xml
، فیلتر قصد بارگذاری را به PlayerActivity
اضافه کنید:
<activity android:name="com.google.sample.cast.castconnect.PlaybackActivity"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.cast.tv.action.LOAD"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
رسیدگی به درخواستهای بار در Android TV
اکنون که فعالیت برای دریافت این intent حاوی درخواست بارگذاری پیکربندی شده است، باید آن را مدیریت کنیم.
هنگامی که فعالیت شروع می شود، برنامه یک روش خصوصی به نام processIntent
فراخوانی می کند. این روش شامل منطق پردازش مقاصد ورودی است. برای رسیدگی به درخواست بارگذاری، این روش را اصلاح می کنیم و با فراخوانی متد onNewIntent
نمونه MediaManager
، هدف را برای پردازش بیشتر ارسال می کنیم. اگر MediaManager
تشخیص دهد که intent یک درخواست بار است، شی MediaLoadRequestData
را از intent استخراج کرده و MediaLoadCommandCallback.onLoad()
را فراخوانی می کند. روش processIntent
را در فایل PlaybackVideoFragment.kt
تغییر دهید تا هدف حاوی درخواست بارگذاری را مدیریت کند:
fun processIntent(intent: Intent?) {
val mediaManager: MediaManager = CastReceiverContext.getInstance().getMediaManager()
// Pass intent to Cast SDK
if (mediaManager.onNewIntent(intent)) {
return
}
// Clears all overrides in the modifier.
mediaManager.getMediaStatusModifier().clear()
// If the SDK doesn't recognize the intent, handle the intent with your own logic.
...
}
در مرحله بعد کلاس انتزاعی MediaLoadCommandCallback
را گسترش می دهیم که متد onLoad()
فراخوانی شده توسط MediaManager
را لغو می کند. این متد داده های درخواست بار را دریافت کرده و به یک شی Movie
تبدیل می کند. پس از تبدیل، فیلم توسط پخش کننده محلی پخش می شود. سپس MediaManager
با MediaLoadRequest
به روز می شود و MediaStatus
برای فرستنده های متصل پخش می کند. یک کلاس خصوصی تودرتو به نام MyMediaLoadCommandCallback
در فایل PlaybackVideoFragment.kt
ایجاد کنید:
import com.google.android.gms.cast.MediaLoadRequestData
import com.google.android.gms.cast.MediaInfo
import com.google.android.gms.cast.MediaMetadata
import com.google.android.gms.cast.MediaError
import com.google.android.gms.cast.tv.media.MediaException
import com.google.android.gms.cast.tv.media.MediaCommandCallback
import com.google.android.gms.cast.tv.media.QueueUpdateRequestData
import com.google.android.gms.cast.tv.media.MediaLoadCommandCallback
import com.google.android.gms.tasks.Task
import com.google.android.gms.tasks.Tasks
import android.widget.Toast
...
private inner class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
override fun onLoad(
senderId: String?, mediaLoadRequestData: MediaLoadRequestData): Task<MediaLoadRequestData> {
Toast.makeText(activity, "onLoad()", Toast.LENGTH_SHORT).show()
return if (mediaLoadRequestData == null) {
// Throw MediaException to indicate load failure.
Tasks.forException(MediaException(
MediaError.Builder()
.setDetailedErrorCode(MediaError.DetailedErrorCode.LOAD_FAILED)
.setReason(MediaError.ERROR_REASON_INVALID_REQUEST)
.build()))
} else Tasks.call {
play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
// Update media metadata and state
val mediaManager = castReceiverContext!!.mediaManager
mediaManager.setDataFromLoad(mediaLoadRequestData)
mediaLoadRequestData
}
}
}
private fun convertLoadRequestToMovie(mediaLoadRequestData: MediaLoadRequestData?): Movie? {
if (mediaLoadRequestData == null) {
return null
}
val mediaInfo: MediaInfo = mediaLoadRequestData.getMediaInfo() ?: return null
var videoUrl: String = mediaInfo.getContentId()
if (mediaInfo.getContentUrl() != null) {
videoUrl = mediaInfo.getContentUrl()
}
val metadata: MediaMetadata = mediaInfo.getMetadata()
val movie = Movie()
movie.videoUrl = videoUrl
movie.title = metadata?.getString(MediaMetadata.KEY_TITLE)
movie.description = metadata?.getString(MediaMetadata.KEY_SUBTITLE)
if(metadata?.hasImages() == true) {
movie.cardImageUrl = metadata.images[0].url.toString()
}
return movie
}
اکنون که Callback تعریف شده است، باید آن را در MediaManager
ثبت کنیم. قبل از فراخوانی MediaManager.onNewIntent()
باید callback ثبت شود. وقتی پخش کننده مقدار دهی اولیه شد، setMediaLoadCommandCallback
را اضافه کنید:
private fun initializePlayer() {
if (mPlayer == null) {
...
mMediaSession = MediaSessionCompat(getContext(), LOG_TAG)
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager: MediaManager = castReceiverContext.getMediaManager()
mediaManager.setSessionCompatToken(mMediaSession.getSessionToken())
mediaManager.setMediaLoadCommandCallback(MyMediaLoadCommandCallback())
}
}
}
بیایید برنامه نمونه را اجرا کنیم
را کلیک کنید دکمه اجرا برای استقرار برنامه در دستگاه ATV شما. از فرستنده خود، روی دکمه Cast کلیک کنید و دستگاه ATV خود را انتخاب کنید. برنامه ATV بر روی دستگاه ATV راه اندازی خواهد شد. یک ویدیو را در تلفن همراه انتخاب کنید، ویدیو شروع به پخش در ATV می کند. بررسی کنید که آیا در تلفن خود اعلان دریافت می کنید که در آن کنترل های پخش را دارید. سعی کنید از کنترل هایی مانند مکث استفاده کنید، ویدیو روی دستگاه ATV باید متوقف شود.
7. پشتیبانی از دستورات کنترل Cast
برنامه فعلی اکنون از دستورات اساسی سازگار با یک جلسه رسانه مانند پخش، مکث و جستجو پشتیبانی می کند. با این حال، برخی از دستورات کنترل Cast وجود دارند که در جلسه رسانه در دسترس نیستند. برای پشتیبانی از آن دستورات کنترل Cast، باید یک MediaCommandCallback
ثبت کنید.
با استفاده از setMediaCommandCallback
هنگامی که پخش کننده مقدار دهی اولیه می شود، MyMediaCommandCallback
به نمونه MediaManager
اضافه کنید:
private fun initializePlayer() {
...
castReceiverContext = CastReceiverContext.getInstance()
if (castReceiverContext != null) {
val mediaManager = castReceiverContext!!.mediaManager
...
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
}
}
کلاس MyMediaCommandCallback
را ایجاد کنید تا متدها را نادیده بگیرید، مانند onQueueUpdate()
برای پشتیبانی از آن دستورات کنترل Cast:
private inner class MyMediaCommandCallback : MediaCommandCallback() {
override fun onQueueUpdate(
senderId: String?,
queueUpdateRequestData: QueueUpdateRequestData
): Task<Void> {
Toast.makeText(getActivity(), "onQueueUpdate()", Toast.LENGTH_SHORT).show()
// Queue Prev / Next
if (queueUpdateRequestData.getJump() != null) {
Toast.makeText(
getActivity(),
"onQueueUpdate(): Jump = " + queueUpdateRequestData.getJump(),
Toast.LENGTH_SHORT
).show()
}
return super.onQueueUpdate(senderId, queueUpdateRequestData)
}
}
8. کار با وضعیت رسانه
تغییر وضعیت رسانه
Cast Connect وضعیت رسانه پایه را از جلسه رسانه دریافت می کند. برای پشتیبانی از ویژگیهای پیشرفته، برنامه Android TV شما میتواند ویژگیهای وضعیت اضافی را از طریق MediaStatusModifier
تعیین و لغو کند. MediaStatusModifier
همیشه روی MediaSession
که در CastReceiverContext
تنظیم کردهاید کار میکند.
به عنوان مثال، برای تعیین setMediaCommandSupported
هنگامی که پاسخ به تماس onLoad
فعال می شود:
import com.google.android.gms.cast.MediaStatus
...
private class MyMediaLoadCommandCallback : MediaLoadCommandCallback() {
fun onLoad(
senderId: String?,
mediaLoadRequestData: MediaLoadRequestData
): Task<MediaLoadRequestData> {
Toast.makeText(getActivity(), "onLoad()", Toast.LENGTH_SHORT).show()
...
return Tasks.call({
play(convertLoadRequestToMovie(mediaLoadRequestData)!!)
...
// Use MediaStatusModifier to provide additional information for Cast senders.
mediaManager.getMediaStatusModifier()
.setMediaCommandSupported(MediaStatus.COMMAND_QUEUE_NEXT, true)
.setIsPlayingAd(false)
mediaManager.broadcastMediaStatus()
// Return the resolved MediaLoadRequestData to indicate load success.
mediaLoadRequestData
})
}
}
رهگیری وضعیت رسانه قبل از ارسال
مشابه MessageInterceptor
SDK گیرنده وب، می توانید MediaStatusWriter
در MediaManager
خود تعیین کنید تا قبل از پخش شدن برای فرستنده های متصل، تغییرات بیشتری در MediaStatus
شما انجام دهد.
به عنوان مثال، می توانید قبل از ارسال به فرستنده های تلفن همراه، داده های سفارشی را در MediaStatus
تنظیم کنید:
import com.google.android.gms.cast.tv.media.MediaManager.MediaStatusInterceptor
import com.google.android.gms.cast.tv.media.MediaStatusWriter
import org.json.JSONObject
import org.json.JSONException
...
private fun initializePlayer() {
if (mPlayer == null) {
...
if (castReceiverContext != null) {
...
val mediaManager: MediaManager = castReceiverContext.getMediaManager()
...
// Use MediaStatusInterceptor to process the MediaStatus before sending out.
mediaManager.setMediaStatusInterceptor(
MediaStatusInterceptor { mediaStatusWriter: MediaStatusWriter ->
try {
mediaStatusWriter.setCustomData(JSONObject("{myData: 'CustomData'}"))
} catch (e: JSONException) {
Log.e(LOG_TAG,e.message,e);
}
})
}
}
}
9. تبریک می گویم
اکنون میدانید که چگونه میتوانید یک برنامه Android TV را با استفاده از کتابخانه Cast Connect فعال کنید.
برای جزئیات بیشتر به راهنمای توسعهدهنده نگاهی بیندازید: /cast/docs/android_tv_receiver .