برنامه Android TV را فعال کنید

1. بررسی اجمالی

نشان‌واره Google Cast

این کد لبه به شما می‌آموزد که چگونه یک برنامه 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.

آنچه شما نیاز دارید

2. کد نمونه را دریافت کنید

می توانید تمام کدهای نمونه را در رایانه خود دانلود کنید ...

و فایل فشرده دانلود شده را باز کنید.

3. برنامه نمونه را اجرا کنید

ابتدا، بیایید ببینیم که برنامه نمونه تکمیل شده چگونه به نظر می رسد. برنامه Android TV از رابط کاربری Leanback و یک پخش کننده ویدیوی اصلی استفاده می کند. کاربر می تواند ویدیویی را از لیست انتخاب کند که پس از انتخاب در تلویزیون پخش می شود. با همراهی برنامه فرستنده تلفن همراه، کاربر می‌تواند ویدیویی را به برنامه Android TV ارسال کند.

تصویر مجموعه‌ای از ریز عکس‌های ویدیویی (که یکی از آنها برجسته شده است) که روی یک پیش‌نمایش تمام‌صفحه یک ویدیو قرار گرفته است. عبارت "Cast Connect" در سمت راست بالا ظاهر می شود

ثبت دستگاه های توسعه دهنده

برای فعال کردن قابلیت‌های Cast Connect برای توسعه برنامه، باید شماره سریال Chromecast داخلی دستگاه Android TV را که می‌خواهید در کنسول برنامه‌نویس Cast استفاده کنید، ثبت کنید. می‌توانید شماره سریال را با رفتن به تنظیمات > تنظیمات برگزیده دستگاه > Chromecast داخلی > شماره سریال در تلویزیون Android خود پیدا کنید. توجه داشته باشید که این شماره با شماره سریال دستگاه فیزیکی شما متفاوت است و باید از روشی که در بالا توضیح داده شد به دست آید.

تصویر یک صفحه تلویزیون Android که صفحه «Chromecast داخلی»، شماره نسخه و شماره سریال را نشان می‌دهد.

بدون ثبت نام، Cast Connect به دلایل امنیتی فقط برای برنامه های نصب شده از فروشگاه Google Play کار می کند. پس از 15 دقیقه از شروع فرآیند ثبت نام، دستگاه خود را مجددا راه اندازی کنید.

برنامه فرستنده اندروید را نصب کنید

برای آزمایش ارسال درخواست‌ها از یک دستگاه تلفن همراه، ما یک برنامه فرستنده ساده به نام Cast Videos را به عنوان فایل mobile-sender-0629.apk در کد منبع دانلود زیپ ارائه کرده‌ایم. ما از ADB برای نصب APK استفاده خواهیم کرد. اگر قبلاً نسخه دیگری از Cast Videos را نصب کرده‌اید، لطفاً قبل از ادامه، آن نسخه را از تمام نمایه‌های موجود در دستگاه حذف نصب کنید.

  1. گزینه های توسعه دهنده و اشکال زدایی USB را در تلفن اندرویدی خود فعال کنید .
  2. یک کابل داده USB را وصل کنید تا تلفن Android خود را به رایانه توسعه متصل کنید.
  3. mobile-sender-0629.apk را روی گوشی اندرویدی خود نصب کنید.

تصویر یک پنجره ترمینال که دستور نصب adb را برای نصب mobile-sender.apk اجرا می کند

  1. می‌توانید برنامه فرستنده Cast Videos را در تلفن Android خود پیدا کنید. نماد برنامه فرستنده Cast Videos

تصویر برنامه فرستنده Cast Videos که روی صفحه تلفن Android اجرا می شود

برنامه Android TV را نصب کنید

دستورالعمل های زیر نحوه باز کردن و اجرای برنامه نمونه تکمیل شده در Android Studio را شرح می دهد:

  1. Import Project را در صفحه خوش آمدگویی یا گزینه های منو File > New > Import Project... را انتخاب کنید.
  2. را انتخاب کنید نماد پوشه دایرکتوری app-done از پوشه کد نمونه و روی OK کلیک کنید.
  3. روی فایل > کلیک کنید پروژه همگام سازی Android App Studio با دکمه Gradle همگام سازی پروژه با فایل های Gradle .
  4. گزینه های برنامه نویس و اشکال زدایی USB را در دستگاه Android TV خود فعال کنید .
  5. ADB به دستگاه Android TV خود متصل شود، دستگاه باید در Android Studio نشان داده شود. تصویری که دستگاه Android TV را در نوار ابزار Android Studio نشان می دهد
  6. را کلیک کنید دکمه اجرای اندروید استودیو، یک مثلث سبز رنگ که به سمت راست اشاره می کند دکمه Run ، باید بعد از چند ثانیه برنامه ATV با نام Cast Connect Codelab ظاهر شود.

بیایید Cast Connect را با برنامه ATV بازی کنیم

  1. به صفحه اصلی Android TV بروید.
  2. برنامه فرستنده Cast Videos را از تلفن Android خود باز کنید. روی دکمه Cast کلیک کنید نماد دکمه Cast و دستگاه ATV خود را انتخاب کنید.
  3. برنامه Cast Connect Codelab ATV در ATV شما راه اندازی می شود و دکمه Cast در فرستنده شما نشان می دهد که متصل است نماد دکمه Cast با رنگ‌های معکوس .
  4. یک ویدیو از برنامه ATV انتخاب کنید و ویدیو در ATV شما شروع به پخش می کند.
  5. اکنون در تلفن همراه شما، یک کنترلر کوچک در پایین برنامه فرستنده شما قابل مشاهده است. می توانید از دکمه پخش/مکث برای کنترل پخش استفاده کنید.
  6. یک ویدیو از تلفن همراه انتخاب کنید و پخش کنید. ویدیو در ATV شما شروع به پخش می کند و کنترلر گسترش یافته در فرستنده تلفن همراه شما نمایش داده می شود.
  7. تلفن خود را قفل کنید و وقتی قفل آن را باز می کنید، باید اعلانی را روی صفحه قفل مشاهده کنید تا پخش رسانه را کنترل کنید یا ارسال را متوقف کنید.

تصویر بخشی از صفحه نمایش تلفن اندرویدی با پخش کننده کوچک در حال پخش یک ویدیو

4. پروژه شروع را آماده کنید

اکنون که ادغام Cast Connect برنامه تکمیل شده را تأیید کردیم، باید پشتیبانی از Cast Connect را به برنامه شروعی که دانلود کردید اضافه کنیم. اکنون شما آماده هستید تا با استفاده از Android Studio روی پروژه شروع کننده ایجاد کنید:

  1. Import Project را در صفحه خوش آمدگویی یا گزینه های منو File > New > Import Project... را انتخاب کنید.
  2. را انتخاب کنید نماد پوشه دایرکتوری app-start از پوشه کد نمونه و روی OK کلیک کنید.
  3. روی فایل > کلیک کنید پروژه همگام سازی اندروید استودیو با دکمه Gradle همگام سازی پروژه با فایل های Gradle .
  4. دستگاه ATV را انتخاب کرده و روی آن کلیک کنید دکمه اجرای اندروید استودیو، یک مثلث سبز رنگ که به سمت راست اشاره می کند دکمه اجرا برای اجرای برنامه و کاوش در رابط کاربری. نوار ابزار Android Studio که دستگاه Android TV انتخاب شده را نشان می دهد

تصویر مجموعه‌ای از ریز عکس‌های ویدیویی (که یکی از آنها برجسته شده است) که روی یک پیش‌نمایش تمام‌صفحه یک ویدیو قرار گرفته است. عبارت "Cast Connect" در سمت راست بالا ظاهر می شود

طراحی اپلیکیشن

این برنامه لیستی از ویدیوها را برای مرورگر در اختیار کاربر قرار می دهد. کاربران می توانند ویدیویی را برای پخش در 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 کلیک کنید نماد دکمه 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 کلیک کنید نماد دکمه 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 .