Menambahkan Fitur Inti ke Penerima Web Kustom Anda

Halaman ini berisi cuplikan kode dan deskripsi fitur yang tersedia untuk aplikasi Penerima Web Kustom.

  1. Elemen cast-media-player yang merepresentasikan UI pemutar bawaan yang disediakan dengan Penerima Web.
  2. Gaya seperti CSS kustom untuk elemen cast-media-player guna mengatur gaya berbagai elemen UI seperti background-image, splash-image, dan font-family.
  3. Elemen skrip untuk memuat framework Penerima Web.
  4. Kode JavaScript untuk mencegat pesan dan menangani peristiwa.
  5. Mengantrekan untuk putar otomatis.
  6. Opsi untuk mengonfigurasi pemutaran.
  7. Opsi untuk menyetel konteks Penerima Web.
  8. Opsi untuk menyetel perintah yang didukung oleh aplikasi Penerima Web.
  9. Panggilan JavaScript untuk memulai aplikasi Penerima Web.

Konfigurasi dan opsi aplikasi

Mengonfigurasi aplikasi

CastReceiverContext adalah class terluar yang diekspos ke developer, dan class ini mengelola pemuatan library pokok dan menangani inisialisasi Web Receiver SDK. SDK menyediakan API yang memungkinkan developer aplikasi mengonfigurasi SDK melalui CastReceiverOptions. Konfigurasi ini dievaluasi sekali per peluncuran aplikasi dan diteruskan ke SDK saat menyetel parameter opsional dalam panggilan ke start.

Contoh di bawah ini menunjukkan cara mengganti perilaku default untuk mendeteksi apakah koneksi pengirim masih terhubung secara aktif. Jika Penerima Web tidak dapat berkomunikasi dengan pengirim selama maxInactivity detik, peristiwa SENDER_DISCONNECTED akan dikirim. Konfigurasi di bawah menggantikan waktu tunggu ini. Hal ini dapat berguna saat men-debug masalah karena mencegah aplikasi Penerima Web menutup sesi Chrome Remote Debugger saat tidak ada pengirim yang terhubung dalam status IDLE.

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

Mengonfigurasi pemutar

Saat memuat konten, Web Receiver SDK menyediakan cara untuk mengonfigurasi variabel pemutaran seperti informasi DRM, konfigurasi percobaan ulang, dan handler permintaan menggunakan cast.framework.PlaybackConfig. Informasi ini ditangani oleh PlayerManager dan dievaluasi pada saat pemain dibuat. Pemutar dibuat setiap kali beban baru diteruskan ke Web Receiver SDK. Modifikasi pada PlaybackConfig setelah pemutar dibuat dievaluasi pada pemuatan konten berikutnya. SDK menyediakan metode berikut untuk mengubah PlaybackConfig.

  • CastReceiverOptions.playbackConfig untuk mengganti opsi konfigurasi default saat melakukan inisialisasi CastReceiverContext.
  • PlayerManager.getPlaybackConfig() untuk mendapatkan konfigurasi saat ini.
  • PlayerManager.setPlaybackConfig() untuk mengganti konfigurasi saat ini. Setelan ini diterapkan ke semua pemuatan berikutnya atau hingga diganti lagi.
  • PlayerManager.setMediaPlaybackInfoHandler() untuk menerapkan konfigurasi tambahan hanya untuk item media yang dimuat di atas konfigurasi saat ini. Handler dipanggil tepat sebelum pembuatan pemutar. Perubahan yang dibuat di sini tidak bersifat permanen dan tidak disertakan dalam kueri ke getPlaybackConfig(). Saat item media berikutnya dimuat, handler ini dipanggil lagi.

Contoh di bawah menunjukkan cara menyetel PlaybackConfig saat menginisialisasi CastReceiverContext. Konfigurasi menggantikan permintaan keluar untuk mendapatkan manifes. Handler menentukan bahwa permintaan Access-Control CORS harus dilakukan menggunakan kredensial seperti cookie atau header otorisasi.

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

Contoh di bawah menunjukkan cara mengganti PlaybackConfig menggunakan getter dan setter yang disediakan di PlayerManager. Setelan ini mengonfigurasi pemutar untuk melanjutkan pemutaran konten setelah 1 segmen dimuat.

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

Contoh di bawah menunjukkan cara mengganti PlaybackConfig untuk permintaan pemuatan tertentu menggunakan pengendali info pemutaran media. Handler memanggil metode getLicenseUrlForMedia yang diterapkan aplikasi untuk mendapatkan licenseUrl dari contentId item saat ini.

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

Pemroses peristiwa

Web Receiver SDK memungkinkan aplikasi Web Receiver Anda menangani peristiwa pemutar. Pemroses peristiwa mengambil parameter cast.framework.events.EventType (atau array parameter ini) yang menentukan peristiwa yang harus memicu pemroses. Array cast.framework.events.EventType yang telah dikonfigurasi sebelumnya dan berguna untuk proses debug dapat ditemukan di cast.framework.events.category. Parameter peristiwa memberikan informasi tambahan tentang peristiwa tersebut.

Misalnya, jika Anda ingin mengetahui kapan perubahan mediaStatus disiarkan, Anda dapat menggunakan logika berikut untuk menangani peristiwa:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

Penyadapan pesan

Web Receiver SDK memungkinkan aplikasi Web Receiver Anda mencegat pesan dan menjalankan kode kustom pada pesan tersebut. Penyadap pesan menggunakan parameter cast.framework.messages.MessageType yang menentukan jenis pesan yang harus disadap.

Interceptor harus menampilkan permintaan yang diubah atau Promise yang di-resolve dengan nilai permintaan yang diubah. Menampilkan null akan mencegah pemanggilan pengendali pesan default. Lihat Memuat media untuk mengetahui detail selengkapnya.

Misalnya, jika ingin mengubah data permintaan pemuatan, Anda dapat menggunakan logika berikut untuk mencegat dan mengubahnya:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_FAILED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      if (!loadRequestData.media.entity) {
        return loadRequestData;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          if (!asset) {
            throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
          }

          loadRequestData.media.contentUrl = asset.url;
          loadRequestData.media.metadata = asset.metadata;
          loadRequestData.media.tracks = asset.tracks;
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

context.start();

Penanganan error

Saat terjadi error di pemroses pesan, aplikasi Penerima Web Anda harus menampilkan cast.framework.messages.ErrorType dan cast.framework.messages.ErrorReason yang sesuai.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_CANCELLED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      ...

      return fetchAssetAndAuth(loadRequestData.media.entity,
                               loadRequestData.credentials)
        .then(asset => {
          ...
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

Penyadapan pesan vs. pemroses peristiwa

Beberapa perbedaan utama antara penyadapan pesan dan pemroses peristiwa adalah sebagai berikut:

  • Pemroses peristiwa tidak memungkinkan Anda mengubah data permintaan.
  • Pemroses peristiwa paling baik digunakan untuk memicu analisis atau fungsi kustom.
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • Penyadapan pesan memungkinkan Anda memproses pesan, menyadapnya, dan memodifikasi data permintaan itu sendiri.
  • Penyadapan pesan paling baik digunakan untuk menangani logika kustom terkait data permintaan.

Memuat media

MediaInformation menyediakan banyak properti untuk memuat media dalam pesan cast.framework.messages.MessageType.LOAD, termasuk entity, contentUrl, dan contentId.

  • entity adalah properti yang disarankan untuk digunakan dalam penerapan Anda untuk aplikasi pengirim dan penerima. Properti ini adalah URL deep link yang dapat berupa playlist atau konten media. Aplikasi Anda harus mengurai URL ini dan mengisi setidaknya salah satu dari dua kolom lainnya.
  • contentUrl sesuai dengan URL yang dapat diputar yang akan digunakan pemutar untuk memuat konten. Misalnya, URL ini dapat mengarah ke manifes DASH.
  • contentId dapat berupa URL konten yang dapat diputar (mirip dengan properti contentUrl ) atau ID unik untuk konten atau playlist yang sedang dimuat. Jika menggunakan properti ini sebagai ID, aplikasi Anda harus mengisi URL yang dapat dimainkan di contentUrl.

Sarannya adalah menggunakan entity untuk menyimpan ID atau parameter kunci yang sebenarnya, dan menggunakan contentUrl untuk URL media. Contohnya ditunjukkan dalam cuplikan berikut di mana entity ada dalam permintaan LOAD dan contentUrl yang dapat dimainkan diambil:

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...

      if (!loadRequestData.media.entity) {
        // Copy the value from contentId for legacy reasons if needed
        loadRequestData.media.entity = loadRequestData.media.contentId;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          loadRequestData.media.contentUrl = asset.url;
          ...
          return loadRequestData;
        });
    });

Kemampuan perangkat

Metode getDeviceCapabilities memberikan informasi perangkat di perangkat Cast yang terhubung dan perangkat video atau audio yang terpasang padanya. Metode getDeviceCapabilities memberikan informasi dukungan untuk Asisten Google, Bluetooth, dan perangkat audio dan layar yang terhubung.

Metode ini menampilkan objek yang dapat Anda kueri dengan meneruskan salah satu enum yang ditentukan untuk mendapatkan kemampuan perangkat untuk enum tersebut. Enum ditentukan di cast.framework.system.DeviceCapabilities.

Contoh ini memeriksa apakah perangkat Penerima Web dapat memutar HDR dan DolbyVision (DV) dengan kunci IS_HDR_SUPPORTED dan IS_DV_SUPPORTED, masing-masing.

const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
  const deviceCapabilities = context.getDeviceCapabilities();
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
  }
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
  }
});
context.start();

Menangani interaksi pengguna

Pengguna dapat berinteraksi dengan aplikasi Penerima Web Anda melalui aplikasi pengirim (Web, Android, dan iOS), perintah suara di perangkat yang kompatibel dengan Asisten, kontrol sentuh di layar smart, dan remote control di perangkat Android TV. Cast SDK menyediakan berbagai API untuk memungkinkan aplikasi Penerima Web menangani interaksi ini, memperbarui UI aplikasi melalui status tindakan pengguna, dan secara opsional mengirim perubahan untuk memperbarui layanan backend.

Perintah media yang didukung

Status kontrol UI didorong oleh MediaStatus.supportedMediaCommands untuk pengontrol yang diperluas pengirim iOS dan Android, aplikasi penerima dan kontrol jarak jauh yang berjalan di perangkat sentuh, dan aplikasi penerima di perangkat Android TV. Jika bitwise Command tertentu diaktifkan di properti, tombol yang terkait dengan tindakan tersebut akan diaktifkan. Jika nilai tidak ditetapkan, tombol akan dinonaktifkan. Nilai ini dapat diubah di Penerima Web dengan:

  1. Menggunakan PlayerManager.setSupportedMediaCommands untuk menyetel Commands tertentu
  2. Menambahkan perintah baru menggunakan addSupportedMediaCommands
  3. Menghapus perintah yang ada menggunakan removeSupportedMediaCommands.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

Saat penerima menyiapkan MediaStatus yang diperbarui, MediaStatus tersebut akan menyertakan perubahan pada properti supportedMediaCommands. Saat status disiarkan, aplikasi pengirim yang terhubung akan memperbarui tombol di UI-nya.

Untuk mengetahui informasi selengkapnya tentang perintah media dan perangkat sentuh yang didukung, lihat panduan Accessing UI controls.

Mengelola status tindakan pengguna

Saat berinteraksi dengan UI atau mengirim perintah suara, pengguna dapat mengontrol pemutaran konten dan properti yang terkait dengan item yang sedang diputar. Permintaan yang mengontrol pemutaran ditangani secara otomatis oleh SDK. Permintaan yang mengubah properti untuk item yang sedang diputar, seperti perintah LIKE, mengharuskan aplikasi penerima menanganinya. SDK menyediakan serangkaian API untuk menangani jenis permintaan ini. Untuk mendukung permintaan ini, hal berikut harus dilakukan:

  • Tetapkan MediaInformation userActionStates dengan preferensi pengguna saat memuat item media.
  • Lakukan intersepsi pesan USER_ACTION dan tentukan tindakan yang diminta.
  • Perbarui MediaInformation UserActionState untuk memperbarui UI.

Cuplikan berikut mencegat permintaan LOAD dan mengisi MediaInformation LoadRequestData. Dalam hal ini, pengguna menyukai konten yang sedang dimuat.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
      const userActionLike = new cast.framework.messages.UserActionState(
          cast.framework.messages.UserAction.LIKE);
      loadRequestData.media.userActionStates = [userActionLike];

      return loadRequestData;
    });

Cuplikan berikut mencegat pesan USER_ACTION dan menangani panggilan backend dengan perubahan yang diminta. Kemudian, aplikasi akan melakukan panggilan untuk mengupdate UserActionState di penerima.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
  (userActionRequestData) => {
    // Obtain the media information of the current content to associate the action to.
    let mediaInfo = playerManager.getMediaInformation();

    // If there is no media info return an error and ignore the request.
    if (!mediaInfo) {
        console.error('Not playing media, user action is not supported');
        return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
    }

    // Reach out to backend services to store user action modifications. See sample below.
    return sendUserAction(userActionRequestData, mediaInfo)

    // Upon response from the backend, update the client's UserActionState.
    .then(backendResponse => updateUserActionStates(backendResponse))

    // If any errors occurred in the backend return them to the cast receiver.
    .catch((error) => {
      console.error(error);
      return error;
    });
});

Cuplikan berikut menyimulasikan panggilan ke layanan backend. Fungsi ini memeriksa UserActionRequestData untuk melihat jenis perubahan yang diminta pengguna dan hanya melakukan panggilan jaringan jika tindakan didukung oleh backend.

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

Cuplikan berikut mengambil UserActionRequestData dan menambahkan atau menghapus UserActionState dari MediaInformation. Memperbarui UserActionState dari MediaInformation akan mengubah status tombol yang terkait dengan tindakan yang diminta. Perubahan ini tercermin dalam UI kontrol layar smart, aplikasi remote control, dan UI Android TV. Pesan ini juga disiarkan melalui pesan MediaStatus keluar untuk memperbarui UI pengontrol yang diperluas untuk pengirim iOS dan Android.

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

Perintah suara

Perintah media berikut saat ini didukung di Web Receiver SDK untuk perangkat yang kompatibel dengan Asisten. Implementasi default perintah ini dapat ditemukan di cast.framework.PlayerManager.

Perintah Deskripsi
Putar Memutar atau melanjutkan pemutaran dari status dijeda.
Jeda Menjeda konten yang sedang diputar.
Sebelumnya Lewati ke item media sebelumnya dalam antrean media Anda.
Berikutnya Lewati ke item media berikutnya dalam antrean media Anda.
Berhenti Hentikan media yang sedang diputar.
Jangan Ulangi Menonaktifkan pengulangan item media dalam antrean setelah item terakhir dalam antrean selesai diputar.
Ulangi Tunggal Mengulangi media yang sedang diputar tanpa batas.
Ulangi Semua Mengulangi semua item dalam antrean setelah item terakhir dalam antrean diputar.
Ulangi Semua dan Acak Setelah item terakhir dalam antrean selesai diputar, acak antrean dan ulangi semua item dalam antrean.
Acak Mengacak item media dalam antrean media Anda.
Teks Tertutup AKTIF / NONAKTIF Aktifkan / Nonaktifkan Pemberian Subtitel untuk media Anda. Aktifkan / Nonaktifkan juga tersedia menurut bahasa.
Cari ke waktu absolut Melompat ke waktu absolut yang ditentukan.
Cari ke waktu relatif terhadap waktu saat ini Melompat maju atau mundur berdasarkan jangka waktu yang ditentukan relatif terhadap waktu pemutaran saat ini.
Mainkan Lagi Mulai ulang media yang sedang diputar atau putar item media yang terakhir diputar jika tidak ada yang sedang diputar.
Menetapkan kecepatan pemutaran Memvariasikan laju pemutaran media. Hal ini akan ditangani secara default. Anda dapat menggunakan pencegat pesan SET_PLAYBACK_RATE untuk mengganti permintaan tarif masuk.

Perintah media yang didukung dengan suara

Untuk mencegah perintah suara memicu perintah media di perangkat yang kompatibel dengan Asisten, Anda harus menetapkan perintah media yang didukung yang akan Anda dukung terlebih dahulu. Kemudian, Anda harus menerapkan perintah tersebut dengan mengaktifkan properti CastReceiverOptions.enforceSupportedCommands. UI pada pengirim Cast SDK dan perangkat yang mendukung sentuhan akan berubah untuk mencerminkan konfigurasi ini. Jika tanda tidak diaktifkan, perintah suara masuk akan dijalankan.

Misalnya, jika Anda mengizinkan PAUSE dari aplikasi pengirim dan perangkat yang mendukung sentuhan, Anda juga harus mengonfigurasi penerima untuk mencerminkan setelan tersebut. Jika dikonfigurasi, perintah suara yang masuk akan diabaikan jika tidak termasuk dalam daftar perintah yang didukung.

Pada contoh di bawah, kita menyediakan CastReceiverOptions saat memulai CastReceiverContext. Kami telah menambahkan dukungan untuk perintah PAUSE dan memastikan pemutar hanya mendukung perintah tersebut. Sekarang, jika perintah suara meminta operasi lain seperti SEEK, permintaan tersebut akan ditolak. Pengguna akan diberi tahu bahwa perintah belum didukung.

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

Anda dapat menerapkan logika terpisah untuk setiap perintah yang ingin Anda batasi. Hapus tanda enforceSupportedCommands dan untuk setiap perintah yang ingin Anda batasi, Anda dapat mencegat pesan masuk. Di sini, kita mencegat permintaan yang diberikan oleh SDK sehingga perintah SEEK yang dikeluarkan ke perangkat yang kompatibel dengan Asisten tidak memicu pencarian di aplikasi Penerima Web Anda.

Untuk perintah media yang tidak didukung aplikasi Anda, kembalikan alasan error yang sesuai, seperti NOT_SUPPORTED.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
  seekData => {
    // Block seeking if the SEEK supported media command is disabled
    if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
      let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
      .INVALID_REQUEST);
      e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
      return e;
    }

    return seekData;
  });

Mengirim ke latar belakang dari aktivitas suara

Jika platform Cast memutar suara aplikasi Anda di latar belakang karena aktivitas Asisten seperti mendengarkan ucapan pengguna atau berbicara kembali, pesan FocusState NOT_IN_FOCUS akan dikirim ke aplikasi Penerima Web saat aktivitas dimulai. Pesan lain dengan IN_FOCUS dikirim saat aktivitas berakhir. Bergantung pada aplikasi dan media yang sedang diputar, Anda mungkin ingin menjeda media saat FocusState NOT_IN_FOCUS dengan mencegat jenis pesan FOCUS_STATE.

Misalnya, pengalaman pengguna yang baik adalah menjeda pemutaran buku audio jika Asisten merespons kueri pengguna.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
  focusStateRequestData => {
    // Pause content when the app is out of focus. Resume when focus is restored.
    if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
      playerManager.pause();
    } else {
      playerManager.play();
    }

    return focusStateRequestData;
  });

Bahasa teks yang ditentukan suara

Jika pengguna tidak secara eksplisit menyatakan bahasa untuk teks, bahasa yang digunakan untuk teks adalah bahasa yang sama dengan bahasa yang digunakan untuk mengucapkan perintah. Dalam skenario ini, parameter isSuggestedLanguage dari pesan masuk menunjukkan apakah bahasa terkait disarankan atau diminta secara eksplisit oleh pengguna.

Misalnya, isSuggestedLanguage disetel ke true untuk perintah "OK Google, aktifkan teks", karena bahasa disimpulkan berdasarkan bahasa yang digunakan untuk mengucapkan perintah. Jika bahasa diminta secara eksplisit, seperti dalam "OK Google, aktifkan teks bahasa Inggris", isSuggestedLanguage akan ditetapkan ke false.

Metadata dan voice casting

Meskipun perintah suara ditangani oleh Penerima Web secara default, Anda harus memastikan metadata untuk konten Anda lengkap dan akurat. Hal ini memastikan bahwa perintah suara ditangani dengan benar oleh Asisten dan metadata ditampilkan dengan benar di berbagai jenis antarmuka baru seperti aplikasi Google Home dan layar smart seperti Google Home Hub.

Transfer streaming

Mempertahankan status sesi adalah dasar dari transfer streaming, di mana pengguna dapat memindahkan streaming audio dan video yang ada di seluruh perangkat menggunakan perintah suara, Aplikasi Google Home, atau Smart Display. Media berhenti diputar di satu perangkat (sumber) dan dilanjutkan di perangkat lain (tujuan). Perangkat Any Cast dengan firmware terbaru dapat berfungsi sebagai sumber atau tujuan dalam transfer streaming.

Alur peristiwa untuk transfer streaming adalah:

  1. Di perangkat sumber:
    1. Media berhenti diputar.
    2. Aplikasi Penerima Web menerima perintah untuk menyimpan status media saat ini.
    3. Aplikasi Penerima Web ditutup.
  2. Di perangkat tujuan:
    1. Aplikasi Penerima Web dimuat.
    2. Aplikasi Penerima Web menerima perintah untuk memulihkan status media yang disimpan.
    3. Media melanjutkan pemutaran.

Elemen status media meliputi:

  • Posisi atau stempel waktu tertentu dari lagu, video, atau item media.
  • Tempatnya dalam antrean yang lebih luas (seperti playlist atau radio artis).
  • Pengguna yang diautentikasi.
  • Status pemutaran (misalnya, diputar atau dijeda).

Mengaktifkan transfer streaming

Untuk menerapkan transfer streaming untuk Penerima Web Anda:

  1. Perbarui supportedMediaCommands dengan perintah STREAM_TRANSFER:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. Secara opsional, ganti interseptor pesan SESSION_STATE dan RESUME_SESSION seperti yang dijelaskan dalam Mempertahankan status sesi. Ganti hanya jika data kustom perlu disimpan sebagai bagian dari snapshot sesi. Jika tidak, penerapan default untuk mempertahankan status sesi akan mendukung transfer streaming.

Mempertahankan status sesi

Web Receiver SDK menyediakan penerapan default untuk aplikasi Web Receiver guna mempertahankan status sesi dengan mengambil snapshot status media saat ini, mengonversi status menjadi permintaan pemuatan, dan melanjutkan sesi dengan permintaan pemuatan.

Permintaan pemuatan yang dihasilkan oleh Penerima Web dapat diganti di pengintersep pesan SESSION_STATE jika diperlukan. Jika Anda ingin menambahkan data kustom ke dalam permintaan pemuatan, sebaiknya masukkan data tersebut ke dalam loadRequestData.customData.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

Data kustom dapat diambil dari loadRequestData.customData di pencegat pesan RESUME_SESSION.

let cred_ = null;
let membership_ = null;

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.RESUME_SESSION,
    function (resumeSessionRequest) {
        let sessionState = resumeSessionRequest.sessionState;

        // Modify sessionState.loadRequestData if needed.
        cred_ = sessionState.loadRequestData.credentials;

        // Retrieve custom data.
        membership_ = sessionState.loadRequestData.customData.membership;

        return resumeSessionRequest;
    });

Pemuatan awal konten

Penerima Web mendukung pemuatan awal item media setelah item pemutaran saat ini dalam antrean.

Operasi pra-muat mendownload beberapa segmen item mendatang sebelumnya. Spesifikasi dilakukan pada nilai preloadTime dalam objek QueueItem (defaultnya 20 detik jika tidak diberikan). Waktu dinyatakan dalam detik, relatif terhadap akhir item yang sedang diputar . Hanya nilai positif yang valid. Misalnya, jika nilainya adalah 10 detik, item ini akan dimuat sebelumnya 10 detik sebelum item sebelumnya selesai. Jika waktu untuk memuat sebelumnya lebih tinggi daripada waktu yang tersisa di currentItem, pemuatan sebelumnya akan terjadi sesegera mungkin. Jadi, jika nilai pramuat yang sangat besar ditentukan pada queueItem, kita dapat mencapai efek bahwa setiap kali kita memutar item saat ini, kita sudah mempramuat item berikutnya. Namun, kami menyerahkan setelan dan pilihan ini kepada developer karena nilai ini dapat memengaruhi bandwidth dan performa streaming item yang sedang diputar.

Pramuat akan berfungsi untuk konten streaming HLS, DASH, dan Smooth secara default.

File audio dan video MP4 reguler seperti MP3 tidak akan dimuat sebelumnya karena perangkat Cast hanya mendukung satu elemen media dan tidak dapat digunakan untuk memuat sebelumnya saat item konten yang ada masih diputar.

Pesan kustom

Pertukaran pesan adalah metode interaksi utama untuk aplikasi Penerima Web.

Pengirim mengirimkan pesan ke Penerima Web menggunakan API pengirim untuk platform tempat pengirim berjalan (Android, iOS, Web). Objek peristiwa (yang merupakan manifestasi pesan) yang diteruskan ke pemroses peristiwa memiliki elemen data (event.data) tempat data mengambil properti jenis peristiwa tertentu.

Aplikasi Penerima Web dapat memilih untuk memproses pesan di namespace tertentu. Dengan demikian, aplikasi Web Receiver dikatakan mendukung protokol namespace tersebut. Kemudian, pengirim yang terhubung dan ingin berkomunikasi di namespace tersebut harus menggunakan protokol yang sesuai.

Semua namespace ditentukan oleh string dan harus dimulai dengan "urn:x-cast:" diikuti dengan string apa pun. Misalnya, "urn:x-cast:com.example.cast.mynamespace".

Berikut cuplikan kode untuk Penerima Web guna memproses pesan kustom dari pengirim yang terhubung:

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
  // handle customEvent.
});

context.start();

Demikian pula, aplikasi Penerima Web dapat terus memberi tahu pengirim tentang status Penerima Web dengan mengirim pesan ke pengirim yang terhubung. Aplikasi Penerima Web dapat mengirim pesan menggunakan sendCustomMessage(namespace, senderId, message) di CastReceiverContext. Penerima Web dapat mengirim pesan ke pengirim tertentu, baik sebagai respons terhadap pesan yang diterima atau karena perubahan status aplikasi. Selain pengiriman pesan point-to-point (dengan batas 64 kb), Penerima Web juga dapat menyiarkan pesan ke semua pengirim yang terhubung.

Transmisi untuk perangkat audio

Lihat Panduan Google Cast untuk perangkat audio untuk mendapatkan dukungan terkait pemutaran khusus audio.

Android TV

Bagian ini membahas cara Google Web Receiver menggunakan input Anda sebagai pemutaran, dan kompatibilitas Android TV.

Mengintegrasikan aplikasi Anda dengan remote kontrol

Google Web Receiver yang berjalan di perangkat Android TV menerjemahkan input dari input kontrol perangkat (yaitu remote kontrol genggam) sebagai pesan pemutaran media yang ditentukan untuk namespace urn:x-cast:com.google.cast.media, seperti yang dijelaskan dalam Pesan Pemutaran Media. Aplikasi Anda harus mendukung pesan ini untuk mengontrol pemutaran media aplikasi agar memungkinkan kontrol pemutaran dasar dari input kontrol Android TV.

Panduan untuk kompatibilitas Android TV

Berikut beberapa rekomendasi dan kesalahan umum yang harus dihindari untuk memastikan aplikasi Anda kompatibel dengan Android TV:

  • Perlu diketahui bahwa string agen pengguna berisi "Android" dan "CrKey"; beberapa situs mungkin mengalihkan ke situs khusus seluler karena mendeteksi label "Android". Jangan berasumsi bahwa "Android" dalam string agen pengguna selalu menunjukkan pengguna seluler.
  • Stack media Android dapat menggunakan GZIP transparan untuk mengambil data. Pastikan data media Anda dapat merespons Accept-Encoding: gzip.
  • Peristiwa media HTML5 Android TV dapat dipicu pada waktu yang berbeda dengan Chromecast, sehingga dapat mengungkapkan masalah yang tersembunyi di Chromecast.
  • Saat memperbarui media, gunakan peristiwa terkait media yang diaktifkan oleh elemen <audio>/<video>, seperti timeupdate, pause, dan waiting. Hindari penggunaan peristiwa terkait jaringan seperti progress, suspend, dan stalled, karena peristiwa ini cenderung bergantung pada platform. Lihat Peristiwa media untuk mengetahui informasi selengkapnya tentang penanganan peristiwa media di penerima.
  • Saat mengonfigurasi sertifikat HTTPS situs penerima, pastikan untuk menyertakan sertifikat CA perantara. Lihat halaman uji SSL Qualsys untuk memverifikasi: jika jalur sertifikasi tepercaya untuk situs Anda menyertakan sertifikat CA yang diberi label “download ekstra”, sertifikat tersebut mungkin tidak dimuat di platform berbasis Android.
  • Meskipun Chromecast menampilkan halaman penerima di bidang grafis 720p, platform Cast lainnya termasuk Android TV dapat menampilkan halaman hingga 1080p. Pastikan halaman penerima Anda dapat diskalakan dengan baik pada resolusi yang berbeda.