1. Tổng quan
Lớp học lập trình này sẽ hướng dẫn bạn cách sửa đổi một ứ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 hiện có trên thiết bị phát 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 sang TV. Một phiên Google Cast thông thường bao gồm hai thành phần — một ứng dụng sender (trình gửi) và một ứng dụng receiver (trình nhận). Ứng dụng gửi (như ứng dụng di động hoặc trang web như Youtube.com) sẽ khởi tạo và điều khiển quá trình phát của ứng dụng nhận Cast. Ứng dụng trình nhận truyền là các ứng dụng HTML 5 chạy trên thiết bị Chromecast và Android TV.
Hầu hết trạng thái trong một phiên truyền đều được lưu trữ trên ứng dụng nhận. Khi trạng thái 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 đa phương tiện sẽ được truyền đến tất cả trình gửi. Các tin truyền này chứa trạng thái hiện tại của phiên Truyền. Ứng dụng gửi dùng trạng thái nội dung nghe nhìn này để hiển thị thông tin về chế độ phát trong giao diện người dùng.
Cast Connect được xây dựng dựa trên cơ sở hạ tầng này, trong đó ứng dụng Android TV đóng vai trò là trình thu. Thư viện Cast Connect cho phép ứng dụng Android TV nhận thông báo và truyền trạng thái nội dung đa phương tiện như thể đó là ứng dụng nhận truyền.
Chúng ta sẽ xây dựng gì?
Khi hoàn tất lớp học lập trình này, bạn sẽ có thể sử dụng ứng dụng trên thiết bị phát Cast để truyền video đến ứng dụng Android TV. Ứng dụng Android TV cũng có thể giao tiếp với ứng dụng trên thiết bị phát qua giao thức Cast.
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 thiết bị phát Cast và 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 trên thiết bị phát Cast.
- Cách gửi trạng thái nội dung đa phương tiện từ ứng dụng ATV đến các ứng dụng truyền Cast.
Bạn cần có
- SDK Android mới nhất.
- Android Studio mới nhất. Cụ thể là
Chipmunk | 2021.2.1
trở lên. - Một thiết bị Android TV đã bật tuỳ chọn cho nhà phát triển và gỡ lỗi qua USB.
- Điện thoại Android đã bật tuỳ chọn cho nhà phát triển và tính năng gỡ lỗi qua USB.
- Cáp dữ liệu USB để kết nối điện thoại Android và thiết bị Android TV với máy tính phát triển.
- Có kiến thức cơ bản về cách phát triển ứng dụng Android bằng Kotlin.
2. Nhận mã mẫu
Bạn có thể tải tất cả mã mẫu xuống máy tính...
rồi 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 chỉnh trông như thế nào. Ứng dụng Android TV sử dụng giao diện người dùng Leanback và trình phát video cơ bản. Người dùng có thể chọn một video trong danh sách, sau đó video đó sẽ phát trên TV khi được chọn. Với ứng dụng trình phát đi đi kèm dành cho thiết bị di động, người dùng cũng có thể truyền video đến ứng dụng Android TV.
Đăng ký thiết bị của nhà phát triển
Để bật các tính năng của Cast Connect nhằm phát triển ứng dụng, bạn phải đăng ký số sê-ri của Chromecast tích hợp của thiết bị Android TV mà bạn sẽ sử dụng trong Cast Developer Console. Bạn có thể tìm thấy số sê-ri bằng cách chuyển đến phần Cài đặt > Lựa chọn ưu tiên về thiết bị > Chromecast tích hợp > Số sê-ri trên Android TV. Xin lưu ý rằng mã này khác với số sê-ri của thiết bị thực và bạn phải lấy mã này theo phương thức được mô tả ở trên.
Nếu bạn không đăng ký, Cast Connect sẽ chỉ hoạt động với các ứng dụng được cài đặt qua Cửa hàng Google Play vì lý do bảo mật. Sau 15 phút kể từ khi bắt đầu quy trình đăng ký, hãy khởi động lại thiết bị.
Cài đặt ứng dụng dành cho người gửi Android
Để kiểm thử việc gửi yêu cầu 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 Cast Videos dưới dạng tệp mobile-sender-0629.apk
trong tệp zip tải mã nguồn xuống. Chúng tôi sẽ tận dụng ADB để cài đặt APK. Nếu bạn đã cài đặt một phiên bản khác của ứng dụng Truyền video, vui lòng gỡ cài đặt phiên bản đó khỏi mọi cấu hình có trên thiết bị trước khi tiếp tục.
- Bật tuỳ chọn cho nhà phát triển và gỡ lỗi qua USB trên điện thoại Android.
- Cắm cáp dữ liệu USB để kết nối điện thoại Android với máy tính phát triển.
- Cài đặt
mobile-sender-0629.apk
vào điện thoại Android của bạn.
- Bạn có thể tìm ứng dụng gửi video Truyền video trên điện thoại Android.
Cài đặt ứng dụng Android TV
Hướng dẫn sau đây mô tả cách mở và chạy ứng dụng mẫu hoàn chỉnh trong Android Studio:
- Chọn Import Project (Nhập dự án) trên màn hình chào mừng hoặc các tuỳ chọn trình đơn File > New > Import Project... (Tệp > Mới > Nhập dự án...).
- Chọn thư mục
app-done
từ thư mục mã mẫu rồi nhấp vào OK. - Nhấp vào File > Sync Project with Gradle Files (Tệp > Đồng bộ hoá dự án với tệp Gradle).
- Bật tuỳ chọn cho nhà phát triển và tính năng gỡ lỗi qua USB trên thiết bị Android TV.
- ADB kết nối với thiết bị Android TV, thiết bị sẽ xuất hiện trong Android Studio.
- Nhấp vào nút Run (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ề Cast Connect) xuất hiện sau vài giây.
Thử chơi Cast Connect với ứng dụng Android TV
- Chuyển đến Màn hình chính của Android TV.
- Mở ứng dụng Cast Videos sender (Ứng dụng truyền video) trên điện thoại Android. Nhấp vào nút Truyền rồi chọn thiết bị ATV.
- Ứng dụng ATV của lớp học lập trình Cast Connect sẽ được chạy trên ATV của bạn và nút Truyền trong thiết bị gửi sẽ cho biết ứng dụng này đã được kết nối .
- Chọn một video trong ứng dụng ATV để video bắt đầu phát trên ATV.
- Trên điện thoại di động của bạn, một tay điều khiển mini sẽ xuất hiện ở cuối ứng dụng gửi. Bạn có thể dùng nút phát/tạm dừng để điều khiển chế độ phát.
- Chọn một video trên điện thoại di động rồi phát. Video sẽ bắt đầu phát trên ATV và tay điều khiển mở rộng sẽ xuất hiện trên thiết bị gửi là thiết bị di động.
- Khoá điện thoại và khi mở khoá, bạn sẽ thấy thông báo trên màn hình khoá điều khiển việc phát nội dung nghe nhìn hoặc dừng truyền.
4. Chuẩn bị dự án khởi động
Giờ đây, khi đã xác minh việc tích hợp Cast Connect của ứng dụng đã hoàn tất, chúng ta cần thêm tính năng hỗ trợ 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 khởi động bằng Android Studio:
- Chọn Import Project (Nhập dự án) trên màn hình chào mừng hoặc các tuỳ chọn trình đơn File > New > Import Project... (Tệp > Mới > Nhập dự án...).
- Chọn thư mục
app-start
trong thư mục mã mẫu rồi nhấp vào OK. - Nhấp vào File > Sync Project with Gradle Files (Tệp > Đồng bộ hoá dự án với tệp Gradle).
- Chọn thiết bị ATV rồi nhấp vào nút Run (Chạy) để chạy ứng dụng và khám phá giao diện người dùng.
Thiết kế ứng dụng
Ứng dụng cung cấp 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: MainActivity
và PlaybackActivity
.
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 video đượ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
đại diện cho một thực thể video có tiêu đề, nội dung mô tả, hình thu nhỏ và URL video. Mỗi đối tượng Movie
được liên kết với một CardPresenter
để hiển thị hình thu nhỏ video cùng với tiêu đề và hãng phim, đồng thời được truyền đến ArrayObjectAdapter
.
Khi bạn chọn một mục, đố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ữ VideoView
với ExoPlayer
, một số chế độ điều khiển nội dung đa phương tiệ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ể dùng điều khiển từ xa để phát/tạm dừng hoặc tua video.
Điều kiện tiên quyết của Cast Connect
Cast Connect sử dụng các 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 phát nội dung đa phương tiện. Thư viện Cast Connect tạo trạng thái của nội dung nghe nhìn dựa trên trạng thái của phiên phát nội dung nghe nhìn. Thư viện Cast Connect cũng sử dụng phiên phát nội dung đa phương tiện của bạn để báo hiệu thời điểm nhận được một số thông báo nhất định 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ợ Truyền
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 thư viện cần thiết:
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 bản dựng dự án không gặp lỗi.
Khởi chạy
CastReceiverContext
là một đối tượng singleton để điều phối tất cả các lượt tương tác 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 trình cung cấp tuỳ chọn receiver trong thẻ <application>
của tệp AndroidManifest.xml
trong ứ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 từ trình truyền 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ẽ 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 ngữ cảnh của trình nhận truyền
Bạn nên bắt đầu CastReceiverContext
khi ứng dụng khởi chạy và dừng CastReceiverContext
khi ứng dụng chuyển sang chế độ 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()
và CastReceiverContext.stop()
Mở tệp MyApplication.kt
, khởi chạy 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à thuộc tính của singleton CastReceiverContext
, thuộc tính này quản lý trạng thái nội dung nghe nhìn, xử lý ý định tải, dịch thông báo không gian tên nội dung nghe nhìn từ người gửi thành lệnh nội dung nghe nhìn và gửi trạng thái nội dung nghe nhìn trở lại 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
để biết nơi gửi lệnh và truy xuất trạng thái phát nội dung đa phương tiệ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 huỷ bỏ MediaSession
do 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 Run (Chạy) để triển khai ứng dụng trên thiết bị ATV, đóng ứng dụng và quay lại Màn hình chính của ATV. Trên thiết bị gửi, hãy nhấp vào nút Truyền rồi chọn thiết bị ATV. Bạn sẽ thấy ứng dụng ATV được chạy trên thiết bị ATV và 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 được xác định trước sau đây vào ứ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ờ, khi 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 sẽ cần xử lý yêu cầu đó.
Ứng dụng 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ý các ý định sắp tới. Để 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
của thực thể MediaManager
. Nếu phát hiện ý định là một yêu cầu tải, MediaManager
sẽ trích xuất đối tượng MediaLoadRequestData
từ ý đị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()
do 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 bằng MediaLoadRequest
và truyền MediaStatus
đến những người gửi đã kết nối. Tạo một lớp riêng tư lồng nhau có 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
}
Giờ đây, khi đã xác định Lệnh gọi lại, chúng ta cần đăng ký lệnh gọi lại đó với MediaManager
. Bạn phải đăng ký lệnh gọi lại trước khi gọi MediaManager.onNewIntent()
. Thêm setMediaLoadCommandCallback
khi khởi động trình phát:
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 Run (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 và chọn thiết bị ATV của bạn. Ứng dụng ATV sẽ được 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 có các chế độ điều khiển phát hay không. Thử dùng các nút điều khiển như tạm dừng, video trên thiết bị ATV sẽ bị tạm dừng.
7. Hỗ trợ lệnh điều khiển tính năng Truyền
Ứng dụng hiện tại hiện 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 Truyền không có trong phiên phát nội dung nghe nhìn. Bạn cần đăng ký MediaCommandCallback
để hỗ trợ các lệnh điều khiển Cast đó.
Thêm MyMediaCommandCallback
vào thực thể MediaManager
bằng setMediaCommandCallback
khi khởi động trình phát:
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 nội dung nghe nhìn
Cast Connect nhận trạng thái nội dung nghe nhìn cơ sở từ phiên phát nội dung đa phương tiện. Để 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 bổ sung 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 lệnh gọi lại onLoad
được kích hoạt:
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
})
}
}
Chặn MediaStatus trước khi gử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 bổ sung cho MediaStatus
trước khi thông báo được truyền đến các trình gửi đã kết nối.
Ví dụ: bạn có thể đặt dữ liệu tuỳ chỉnh trong MediaStatus
trước khi gửi cho người gửi qua 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 hỗ trợ tính năng Truyền ứng dụng trên Android TV bằng Thư viện Cast Connect.
Hãy xem hướng dẫn dành cho nhà phát triển để biết thêm thông tin chi tiết: /cast/docs/android_tv_receiver.