Bật tính năng truyền ứng dụng Android TV

1. Tổng quan

Biểu tượng của Google Cast

Lớp học lập trình này sẽ hướng dẫn bạn cách sửa đổi ứng dụng Android TV hiện có để hỗ trợ tính năng truyền và giao tiếp từ các ứng dụng người gửi hiện có trên Cast.

Google Cast và Cast Connect là gì?

Google Cast cho phép người dùng truyền nội dung từ thiết bị di động lên TV. Phiên Google Cast điển hình bao gồm hai thành phần — ứng dụng người gửi và ứng dụng người nhận. Các ứng dụng người gửi, chẳng hạn như một ứng dụng hoặc trang web dành cho thiết bị di động, chẳng hạn như YouTube.com, sẽ khởi tạo và kiểm soát việc phát ứng dụng bộ thu Truyền. Ứng dụng bộ thu Cast là các ứng dụng HTML 5 chạy trên thiết bị Chromecast và Android TV.

Hầu hết tất cả trạng thái trong một phiên Truyền được lưu trữ trên ứng dụng trình nhận. Khi trạng thái này cập nhật, ví dụ: nếu một mục nội dung đa phương tiện mới được tải, thì trạng thái nội dung nghe nhìn sẽ được phát cho tất cả người gửi. Các hoạt động truyền phát này chứa trạng thái hiện tại của phiên Truyền. Ứng dụng của người gửi sử dụng trạng thái phương tiện này để hiển thị thông tin phát lại trong giao diện người dùng của họ.

Cast Connect được xây dựng dựa trên cơ sở hạ tầng này, với ứng dụng Android TV của bạn hoạt động như một bộ thu. Thư viện Cast Connect cho phép ứng dụng Android TV của bạn nhận tin nhắn và truyền phát trạng thái nội dung nghe nhìn như thể đó là ứng dụng bộ thu truyền.

Chúng ta sẽ xây dựng gì?

Sau khi kết thúc lớp học lập trình này, bạn có thể dùng các ứng dụng truyền của người gửi để truyền video đến ứng dụng Android TV. Ứng dụng Android TV cũng có thể giao tiếp với các ứng dụng gửi qua giao thức Truyền.

Kiến thức bạn sẽ học được

  • Cách thêm thư viện Cast Connect vào ứng dụng ATV mẫu.
  • Cách kết nối người gửi trên Cast và khởi chạy ứng dụng ATV.
  • Cách bắt đầu phát nội dung nghe nhìn trên ứng dụng ATV từ ứng dụng người gửi Cast.
  • Cách gửi trạng thái nội dung nghe nhìn từ ứng dụng ATV đến các ứng dụng gửi dữ liệu truyền.

Những gì bạn cần

2. Lấy mã mẫu

Bạn có thể tải tất cả mã mẫu xuống máy tính của mình...

và giải nén tệp zip đã tải xuống.

3. Chạy ứng dụng mẫu

Trước tiên, hãy xem ứng dụng mẫu hoàn thiện trông như thế nào. Ứng dụng Android TV sử dụng giao diện người dùng Leanback và một trình phát video cơ bản. Người dùng có thể chọn video từ danh sách mà sau đó phát trên TV khi được chọn. Với ứng dụng người gửi dành cho thiết bị di động đi kèm, người dùng cũng có thể truyền video sang ứng dụng Android TV.

Hình ảnh một chuỗi hình thu nhỏ của video (một trong số đó được làm nổi bật) phủ lên bản xem trước toàn màn hình của một video; các từ &hl=vi;Cast Connect' xuất hiện ở phía trên bên phải

Đăng ký thiết bị dành cho nhà phát triển

Để bật tính năng Cast Connect cho việc phát triển ứng dụng, bạn phải đăng ký số sê-ri của Chromecast tích hợp trên thiết bị Android TV mà bạn sẽ sử dụng trong Bảng điều khiển dành cho nhà phát triển trên Cast. Bạn có thể tìm thấy số sê-ri bằng cách chuyển đến phần Settings > Device Preferences > Chromecast Tích hợp > Số sê-ri trên Android TV. Xin lưu ý rằng số này khác với số sê-ri trên thiết bị thực của bạn và phải lấy từ phương thức được mô tả ở trên.

Hình ảnh màn hình Android TV cho thấy dữ liệu &

Nếu không đăng ký, Cast Connect sẽ chỉ hoạt động đối với các ứng dụng được cài đặt từ Cửa hàng Google Play vì lý do bảo mật. Sau 15 phút kể từ khi đăng ký, hãy khởi động lại thiết bị của bạn.

Cài đặt ứng dụng người gửi Android

Để thử nghiệm việc gửi yêu cầu từ một thiết bị di động, chúng tôi đã cung cấp một ứng dụng gửi đơn giản có tên là Truyền video dưới dạng tệp mobile-sender-0629.apk trong tệp zip tải xuống mã nguồn. Chúng tôi sẽ tận dụng ADB để cài đặt APK. Nếu bạn đã cài đặt phiên bản khác của Video truyền, vui lòng gỡ cài đặt phiên bản đó khỏi tất cả các hồ sơ trên thiết bị trước khi tiếp tục.

  1. Bật tuỳ chọn cho nhà phát triển và gỡ lỗi USB trên điện thoại Android.
  2. Cắm cáp dữ liệu USB để kết nối điện thoại Android của bạn với máy tính phát triển.
  3. Cài đặt mobile-sender-0629.apk trên điện thoại Android của bạn.

Hình ảnh cửa sổ dòng lệnh chạy lệnh cài đặt adb để cài đặt mobile-Sender.apk

  1. Bạn có thể tìm thấy ứng dụng gửi video Truyền video trên điện thoại Android của mình. Biểu tượng ứng dụng truyền video của người gửi

Hình ảnh ứng dụng người gửi Video truyền đang chạy trên màn hình điện thoại Android

Cài đặt ứng dụng Android TV

Các hướng dẫn sau mô tả cách mở và chạy ứng dụng mẫu đã hoàn tất trong Android Studio:

  1. Chọn Nhập dự án trên màn hình chào mừng hoặc tùy chọn Tệp > Mới > Nhập dự án....
  2. Chọn thư mục biểu tượng thư mụcapp-done trong thư mục mã mẫu rồi nhấp vào OK.
  3. Nhấp vào File > Đồng bộ hóa Dự án Android App Studio với nút Gradle Sync Project with Gradle Files (Đồng bộ hoá dự án với tệp Gradle).
  4. Bật tuỳ chọn cho nhà phát triển và gỡ lỗi qua USB trên thiết bị Android TV.
  5. ADB kết nối với thiết bị Android TV của bạn. Thiết bị sẽ hiển thị trong Android Studio. Hình ảnh thiết bị Android TV xuất hiện trên thanh công cụ Android Studio
  6. Nhấp vào nút Nút Run (Chạy) trên Android Studio, hình tam giác màu xanh lục chỉ về bên phảiRun (Chạy), bạn sẽ thấy ứng dụng ATV có tên Cast Connect Codelab (Lớp học lập trình về truyền kết nối) xuất hiện sau vài giây.

Hãy phát Cast Connect bằng ứng dụng ATV

  1. Chuyển đến Màn hình chính của Android TV.
  2. Mở ứng dụng truyền Người gửi video từ điện thoại Android của bạn. Nhấp vào nút Truyền Biểu tượng nút truyền rồi chọn thiết bị ATV của bạn.
  3. Ứng dụng ATV của lớp học Cast Connect Connect sẽ được chạy trên ATV của bạn và nút Truyền trong người gửi sẽ cho biết rằng ứng dụng này đã kết nối với Biểu tượng nút truyền có màu đảo ngược.
  4. Chọn một video từ ứng dụng ATV và video đó sẽ bắt đầu phát trên ATV của bạn.
  5. Trên điện thoại di động, bộ điều khiển nhỏ giờ đây sẽ hiển thị ở cuối ứng dụng người gửi. Bạn có thể sử dụng nút phát/tạm dừng để điều khiển chế độ phát.
  6. Chọn một video từ điện thoại di động và phát. Video sẽ bắt đầu phát trên ATV và tay điều khiển mở rộng sẽ hiển thị trên người gửi trên thiết bị di động.
  7. Khóa điện thoại và khi mở khóa, bạn sẽ thấy một thông báo trên màn hình khóa để điều khiển nội dung nghe nhìn phát lại hoặc dừng truyền.

Hình ảnh một phần màn hình điện thoại Android khi trình phát thu nhỏ đang phát video

4. Chuẩn bị dự án bắt đầu

Giờ đây, chúng tôi đã xác minh việc tích hợp Cast Connect đã hoàn tất của ứng dụng nên chúng tôi cần thêm hỗ trợ cho Cast Connect vào ứng dụng khởi động mà bạn đã tải xuống. Bây giờ, bạn đã sẵn sàng xây dựng dựa trên dự án ban đầu bằng Android Studio:

  1. Chọn Nhập dự án trên màn hình chào mừng hoặc tùy chọn Tệp > Mới > Nhập dự án....
  2. Chọn thư mục biểu tượng thư mụcapp-start trong thư mục mã mẫu rồi nhấp vào OK.
  3. Nhấp vào File > Đồng bộ hoá Dự án Android Studio với nút Gradle Sync Project with Gradle Files (Đồng bộ hoá dự án với tệp Gradle).
  4. Chọn thiết bị ATV rồi nhấp vào nút Nút Run (Chạy) của Android Studio, một hình tam giác màu xanh lục chỉ về bên phảiRun (Chạy) để chạy ứng dụng và khám phá giao diện người dùng. Thanh công cụ Android Studio hiển thị thiết bị Android TV đã chọn

Hình ảnh một chuỗi hình thu nhỏ của video (một trong số đó được làm nổi bật) phủ lên bản xem trước toàn màn hình của một video; các từ &hl=vi;Cast Connect' xuất hiện ở phía trên bên phải

Thiết kế ứng dụng

Ứng dụng này cung cấp một danh sách video để người dùng duyệt xem. Người dùng có thể chọn một video để phát trên Android TV. Ứng dụng này bao gồm hai hoạt động chính: MainActivityPlaybackActivity.

MainActivity

Hoạt động này chứa một Mảnh (MainFragment). Danh sách video và siêu dữ liệu liên kết của chúng được định cấu hình trong lớp MovieList và phương thức setupMovies() được gọi để tạo danh sách đối tượng Movie.

Đối tượng Movie biểu thị một thực thể video có tiêu đề, nội dung mô tả, hình thu nhỏ hình ảnh và url video. Mỗi đối tượng Movie được liên kết với một CardPresenter để thể hiện hình thu nhỏ của video bằng tiêu đề và studio, rồi chuyển đến ArrayObjectAdapter.

Khi một mục được chọn, đối tượng Movie tương ứng sẽ được truyền đến PlaybackActivity.

PlaybackActivity

Hoạt động này chứa một Mảnh (PlaybackVideoFragment) lưu trữ một VideoView với ExoPlayer, một số nút điều khiển nội dung nghe nhìn và một vùng văn bản để hiển thị nội dung mô tả của video đã chọn và cho phép người dùng phát video trên Android TV. Người dùng có thể sử dụng điều khiển từ xa để phát/tạm dừng hoặc tìm cách phát video.

Điều kiện tiên quyết về Cast Connect

Cast Connect sử dụng phiên bản mới của Dịch vụ Google Play yêu cầu ứng dụng ATV của bạn phải được cập nhật để sử dụng không gian tên AndroidX.

Để hỗ trợ Cast Connect trong ứng dụng Android TV, bạn phải tạo và hỗ trợ các sự kiện từ một phiên nội dung nghe nhìn. Thư viện Cast Connect tạo trạng thái phương tiện dựa trên trạng thái của phiên phương tiện. Thư viện Cast Connect cũng sử dụng phiên đa phương tiện của bạn để thông báo khi nhận được một số tin nhắn từ người gửi, chẳng hạn như tạm dừng.

5. Định cấu hình tính năng hỗ trợ Cast

Phần phụ thuộc

Cập nhật tệp build.gradle của ứng dụng để thêm các phần phụ thuộc cần thiết vào thư viện:

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'
}

Đồng bộ hoá dự án để xác nhận rằng các bản dựng của dự án không có lỗi.

Khởi chạy

CastReceiverContext là đối tượng singleton để điều phối tất cả các tương tác với Cast. Bạn phải triển khai giao diện ReceiverOptionsProvider để cung cấp CastReceiverOptions khi CastReceiverContext được khởi tạo.

Tạo tệp CastReceiverOptionsProvider.kt và thêm lớp sau vào dự án:

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()
    }
}

Sau đó, hãy chỉ định nhà cung cấp tùy chọn nhận trong thẻ <application> của tệp AndroidManifest.xml của ứng dụng:

<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>

Để kết nối với ứng dụng ATV trên thiết bị phát Cast, hãy chọn một hoạt động bạn muốn chạy. Trong lớp học lập trình này, chúng ta sẽ khởi chạy MainActivity của ứng dụng khi bắt đầu một phiên truyền. Trong tệp AndroidManifest.xml, hãy thêm bộ lọc ý định khởi chạy trong 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>

Vòng đời bối cảnh của bộ thu truyền

Bạn nên khởi động CastReceiverContext khi chạy ứng dụng và dừng CastReceiverContext khi ứng dụng chuyển sang chạy trong nền. Bạn nên sử dụng LifecycleObserver trong thư viện androidx.lifecycle để quản lý việc gọi CastReceiverContext.start()CastReceiverContext.stop()

Mở tệp MyApplication.kt, khởi động ngữ cảnh truyền bằng cách gọi initInstance() trong phương thức onCreate của ứng dụng. Trong lớp AppLifeCycleObserver start(), CastReceiverContext khi ứng dụng được tiếp tục và stop() khi ứng dụng bị tạm dừng:

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()
        }
    }
}

Kết nối MediaSession với MediaManager

MediaManager là một thuộc tính của singleton CastReceiverContext, quản lý trạng thái phương tiện, xử lý ý định tải, dịch thông báo vùng chứa tên phương tiện từ người gửi thành các lệnh phương tiện và gửi lại trạng thái phương tiện cho người gửi.

Khi tạo MediaSession, bạn cũng cần cung cấp mã thông báo MediaSession hiện tại cho MediaManager để ứng dụng biết nơi gửi lệnh và truy xuất trạng thái phát nội dung nghe nhìn. Trong tệp PlaybackVideoFragment.kt, hãy đảm bảo MediaSession được khởi chạy trước khi đặt mã thông báo thành 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())
            }

        }
    }
}

Khi phát hành MediaSession do chế độ phát không hoạt động, bạn nên đặt mã thông báo rỗng trên MediaManager:

private fun releasePlayer() {
    mMediaSession?.release()
    castReceiverContext?.mediaManager?.setSessionCompatToken(null)
    ...
}

Hãy chạy ứng dụng mẫu

Nhấp vào nút Nút Run (Chạy) của Android Studio, một hình tam giác màu xanh lục chỉ về bên phảiRun (Chạy) để triển khai ứng dụng trên thiết bị ATV, đóng ứng dụng rồi quay lại Màn hình chính ATV. Từ người gửi của bạn, nhấp vào nút Truyền Biểu tượng nút truyền và chọn thiết bị ATV của bạn. Bạn sẽ thấy ứng dụng ATV khởi chạy trên thiết bị ATV và trạng thái nút Truyền đã kết nối.

6. Đang tải nội dung nghe nhìn

Lệnh tải được gửi qua một ý định có tên gói mà bạn đã xác định trong bảng điều khiển dành cho nhà phát triển. Bạn cần thêm bộ lọc ý định đã xác định trước sau đây trong ứng dụng Android TV để chỉ định hoạt động mục tiêu sẽ nhận được ý định này. Trong tệp AndroidManifest.xml, hãy thêm bộ lọc ý định tải vào 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>

Xử lý yêu cầu tải trên Android TV

Bây giờ, hoạt động được định cấu hình để nhận ý định này chứa yêu cầu tải, chúng ta cần phải xử lý ý định đó.

Ứng dụng này gọi một phương thức riêng tư có tên là processIntent khi hoạt động bắt đầu. Phương thức này chứa logic để xử lý ý định đến. Để xử lý yêu cầu tải, chúng ta sẽ sửa đổi phương thức này và gửi ý định để được xử lý thêm bằng cách gọi phương thức onNewIntent phiên bản MediaManager. Nếu phát hiện ý định này là một yêu cầu tải, thì MediaManager sẽ trích xuất đối tượng MediaLoadRequestData qua ý định đó và gọi MediaLoadCommandCallback.onLoad(). Sửa đổi phương thức processIntent trong tệp PlaybackVideoFragment.kt để xử lý ý định chứa yêu cầu tải:

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.
    ...
}

Tiếp theo, chúng ta sẽ mở rộng lớp trừu tượng MediaLoadCommandCallback. Lớp này sẽ ghi đè phương thức onLoad()MediaManager gọi. Phương thức này nhận dữ liệu của yêu cầu tải và chuyển đổi dữ liệu đó thành đối tượng Movie. Sau khi chuyển đổi, trình phát cục bộ sẽ phát phim. Sau đó, MediaManager được cập nhật với MediaLoadRequest và phát MediaStatus đến những người gửi được kết nối. Tạo một lớp riêng tư lồng nhau tên là MyMediaLoadCommandCallback trong tệp 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
}

Bây giờ, lệnh gọi lại đã được định nghĩa, chúng ta cần đăng ký lệnh gọi lại đó đến MediaManager. Lệnh gọi lại phải được đăng ký trước khi gọi MediaManager.onNewIntent(). Thêm setMediaLoadCommandCallback khi trình phát được khởi chạy:

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())
        }
    }
}

Hãy chạy ứng dụng mẫu

Nhấp vào nút Nút Run (Chạy) của Android Studio, một hình tam giác màu xanh lục chỉ về bên phảiRun (Chạy) để triển khai ứng dụng trên thiết bị ATV. Từ người gửi của bạn, nhấp vào nút Truyền Biểu tượng nút truyền và chọn thiết bị ATV của bạn. Ứng dụng ATV sẽ chạy trên thiết bị ATV. Chọn một video trên thiết bị di động, video đó sẽ bắt đầu phát trên ATV. Kiểm tra xem bạn có nhận được thông báo trên điện thoại ở nơi bạn có bộ điều khiển chế độ phát hay không. Hãy thử dùng các chế độ điều khiển như tạm dừng, video trên thiết bị ATV sẽ tạm dừng.

7. Hỗ trợ các lệnh điều khiển truyền

Ứng dụng hiện tại hỗ trợ các lệnh cơ bản tương thích với một phiên phát nội dung đa phương tiện, chẳng hạn như phát, tạm dừng và tua. Tuy nhiên, có một số lệnh điều khiển tính năng Truyền không có sẵn trong phiên đa phương tiện. Bạn cần đăng ký MediaCommandCallback để hỗ trợ các lệnh điều khiển tính năng Truyền đó.

Thêm MyMediaCommandCallback vào bản sao MediaManager bằng cách sử dụng setMediaCommandCallback khi trình phát được khởi chạy:

private fun initializePlayer() {
    ...
    castReceiverContext = CastReceiverContext.getInstance()
    if (castReceiverContext != null) {
        val mediaManager = castReceiverContext!!.mediaManager
        ...
        mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
    }
}

Tạo lớp MyMediaCommandCallback để ghi đè các phương thức, chẳng hạn như onQueueUpdate() để hỗ trợ các lệnh điều khiển Truyền đó:

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. Làm việc với trạng thái nội dung nghe nhìn

Sửa đổi trạng thái phương tiện

Cast Connect nhận trạng thái nội dung nghe nhìn cơ sở của phiên phát nội dung đa phương tiện này. Để hỗ trợ các tính năng nâng cao, ứng dụng Android TV có thể chỉ định và ghi đè các thuộc tính trạng thái khác thông qua MediaStatusModifier. MediaStatusModifier sẽ luôn hoạt động trên MediaSession mà bạn đã đặt trong CastReceiverContext.

Ví dụ: để chỉ định setMediaCommandSupported khi kích hoạt lệnh gọi lại 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
        })
    }
}

Ngăn chặn MediaStatus trước khi gửi đi

Tương tự như MessageInterceptor của SDK bộ thu web, bạn có thể chỉ định MediaStatusWriter trong MediaManager để thực hiện các sửa đổi khác đối với MediaStatus trước khi phát đi thông báo cho người gửi được kết nối.

Ví dụ: bạn có thể đặt dữ liệu tuỳ chỉnh trong MediaStatus trước khi gửi đến người gửi trên thiết bị di động:

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. Xin chúc mừng

Giờ đây, bạn đã biết cách bật ứng dụng Android TV bằng Thư viện Cast Connect.

Hãy xem hướng dẫn cho nhà phát triển để biết thêm chi tiết: /cast/docs/android_tv_Receiver.