Điểm chèn quảng cáo
Android Sender SDK hỗ trợ các Điểm chèn quảng cáo và quảng cáo đồng hành trong luồng phương tiện nhất định.
Xem Tổng quan về điểm chèn quảng cáo của trình thu nhận web để tìm hiểu thêm thông tin về cách hoạt động của Điểm chèn quảng cáo.
Mặc dù có thể chỉ định điểm chèn quảng cáo cho cả người gửi và người nhận, nhưng bạn nên được chỉ định trên Web receiver và Bộ thu Android TV để duy trì sự nhất quán trên các nền tảng.
Trên Android, hãy chỉ định điểm chèn quảng cáo trong một lệnh tải bằng cách sử dụng
AdBreakClipInfo
và AdBreakInfo
:
val breakClip1: AdBreakClipInfo = AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build() val breakClip2: AdBreakClipInfo = … val breakClip3: AdBreakClipInfo = … val break1: AdBreakClipInfo = AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build() val mediaInfo: MediaInfo = MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build() val mediaLoadRequestData: MediaLoadRequestData = MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build() remoteMediaClient.load(mediaLoadRequestData)
AdBreakClipInfo breakClip1 = new AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build(); AdBreakClipInfo breakClip2 = … AdBreakClipInfo breakClip3 = … AdBreakInfo break1 = new AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build(); MediaInfo mediaInfo = new MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build(); MediaLoadRequestData mediaLoadRequestData = new MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build(); remoteMediaClient.load(mediaLoadRequestData);
Thêm thao tác tuỳ chỉnh
Ứng dụng của người gửi có thể mở rộng
MediaIntentReceiver
để xử lý các thao tác tuỳ chỉnh hoặc ghi đè hành vi của thao tác đó. Nếu bạn đã triển khai
MediaIntentReceiver
của riêng bạn, bạn cần thêm nó vào tệp kê khai, đồng thời đặt
trong CastMediaOptions
. Ví dụ này cung cấp các thao tác tuỳ chỉnh
ghi đè bật/tắt chế độ phát nội dung nghe nhìn từ xa, nhấn nút nội dung nghe nhìn và các chế độ khác
hành động.
// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
// In your OptionsProvider var mediaOptions = CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver::class.java.name) .build() // Implementation of MyMediaIntentReceiver internal class MyMediaIntentReceiver : MediaIntentReceiver() { override fun onReceiveActionTogglePlayback(currentSession: Session) { } override fun onReceiveActionMediaButton(currentSession: Session, intent: Intent) { } override fun onReceiveOtherAction(context: Context?, action: String, intent: Intent) { } }
// In your OptionsProvider CastMediaOptions mediaOptions = new CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver.class.getName()) .build(); // Implementation of MyMediaIntentReceiver class MyMediaIntentReceiver extends MediaIntentReceiver { @Override protected void onReceiveActionTogglePlayback(Session currentSession) { } @Override protected void onReceiveActionMediaButton(Session currentSession, Intent intent) { } @Override protected void onReceiveOtherAction(Context context, String action, Intent intent) { } }
Thêm kênh tuỳ chỉnh
Để ứng dụng của người gửi giao tiếp với ứng dụng nhận, ứng dụng của bạn cần phải
hãy tạo một kênh tuỳ chỉnh. Người gửi có thể sử dụng kênh tuỳ chỉnh để gửi chuỗi
tin nhắn đến người nhận. Mỗi kênh tuỳ chỉnh được xác định bởi một giá trị duy nhất
không gian tên và phải bắt đầu bằng tiền tố urn:x-cast:
, ví dụ:
urn:x-cast:com.example.custom
. Bạn có thể có nhiều tùy chỉnh
và mỗi kênh có một không gian tên duy nhất. Ứng dụng nhận cũng có thể
gửi và nhận tin nhắn
sử dụng cùng một không gian tên.
Kênh tuỳ chỉnh được triển khai bằng
Cast.MessageReceivedCallback
giao diện:
class HelloWorldChannel : MessageReceivedCallback { val namespace: String get() = "urn:x-cast:com.example.custom" override fun onMessageReceived(castDevice: CastDevice, namespace: String, message: String) { Log.d(TAG, "onMessageReceived: $message") } }
class HelloWorldChannel implements Cast.MessageReceivedCallback { public String getNamespace() { return "urn:x-cast:com.example.custom"; } @Override public void onMessageReceived(CastDevice castDevice, String namespace, String message) { Log.d(TAG, "onMessageReceived: " + message); } }
Sau khi ứng dụng của người gửi được kết nối với ứng dụng nhận, kênh tuỳ chỉnh có thể
được tạo bằng cách sử dụng
setMessageReceivedCallbacks
phương thức:
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.namespace, mHelloWorldChannel) } catch (e: IOException) { Log.e(TAG, "Exception while creating channel", e) }
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.getNamespace(), mHelloWorldChannel); } catch (IOException e) { Log.e(TAG, "Exception while creating channel", e); }
Sau khi kênh tuỳ chỉnh được tạo, người gửi có thể sử dụng
sendMessage
để gửi thông báo chuỗi đến người nhận qua kênh đó:
private fun sendMessage(message: String) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.namespace, message) .setResultCallback { status -> if (!status.isSuccess) { Log.e(TAG, "Sending message failed") } } } catch (e: Exception) { Log.e(TAG, "Exception while sending message", e) } } }
private void sendMessage(String message) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.getNamespace(), message) .setResultCallback( status -> { if (!status.isSuccess()) { Log.e(TAG, "Sending message failed"); } }); } catch (Exception e) { Log.e(TAG, "Exception while sending message", e); } } }
Hỗ trợ tính năng tự động phát
Xem phần API Tự động phát và xếp hàng.
Ghi đè lựa chọn hình ảnh cho các tiện ích trải nghiệm người dùng
Các thành phần khác nhau của khung (cụ thể là hộp thoại Truyền, màn hình chính
trình điều khiển và UIMediaController, nếu được định cấu hình) sẽ hiển thị hình minh hoạ
cho nội dung nghe nhìn hiện đang truyền. URL đến hình minh hoạ hình ảnh thường
có trong MediaMetadata
cho nội dung nghe nhìn, nhưng ứng dụng gửi có thể có
nguồn thay thế cho URL.
Lớp ImagePicker
xác định phương thức chọn hình ảnh phù hợp trong danh sách hình ảnh trong MediaMetadata
, dựa trên cách sử dụng hình ảnh, ví dụ: hình thu nhỏ thông báo hoặc nền toàn màn hình. Phương thức triển khai ImagePicker
mặc định
luôn chọn hình ảnh đầu tiên hoặc trả về giá trị rỗng nếu không có hình ảnh nào trong
MediaMetadata
. Ứng dụng có thể tạo lớp con ImagePicker
và ghi đè phương thức
onPickImage(MediaMetadata, ImageHints)
để cung cấp phương thức triển khai thay thế, sau đó chọn lớp con đó
với
setImagePicker
của CastMediaOptions.Builder
.
ImageHints
cung cấp gợi ý cho ImagePicker
về loại và kích thước của hình ảnh
được chọn để hiển thị trong giao diện người dùng.
Tuỳ chỉnh hộp thoại Truyền
Quản lý vòng đời phiên
SessionManager
là vị trí trung tâm để quản lý vòng đời phiên. SessionManager
theo dõi các thay đổi về trạng thái lựa chọn tuyến đường Android MediaRouter
để bắt đầu, tiếp tục và kết thúc các phiên. Khi một tuyến đường là
đã chọn, SessionManager
sẽ tạo một
Session
đối tượng và cố gắng bắt đầu hoặc tiếp tục đối tượng đó. Khi một tuyến đường không được chọn,
SessionManager
sẽ kết thúc phiên hiện tại.
Do đó, để đảm bảo SessionManager
quản lý vòng đời phiên đúng cách, bạn
phải đảm bảo rằng:
- Trong hộp thoại bộ chọn tuyến đường,
cuộc gọi
MediaRouter.selectRoute(MediaRouter.RouteInfo)
khi người dùng chọn một thiết bị. - Trong hộp thoại trình điều khiển tuyến đường (trong thẻ đã kết nối
trạng thái hoặc
truyền
state),
cuộc gọi
MediaRouter.unselect(int)
khi người dùng ngừng truyền.
Tùy thuộc vào cách bạn tạo hộp thoại Truyền, bạn có thể cần thực hiện thêm các thao tác khác đã hoàn tất:
- Nếu bạn tạo hộp thoại Truyền bằng
MediaRouteChooserDialog
vàMediaRouteControllerDialog
, thì các hộp thoại này sẽ tự động cập nhật lựa chọn tuyến trongMediaRouter
, vì vậy, bạn không cần làm gì cả. - Nếu bạn thiết lập nút Truyền bằng
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
hoặcCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, thì hộp thoại thực sự được tạo bằngMediaRouteChooserDialog
vàMediaRouteControllerDialog
, vì vậy bạn cũng không cần làm gì thêm. - Đối với các trường hợp khác, bạn sẽ tạo hộp thoại Truyền tuỳ chỉnh nên cần
làm theo các hướng dẫn ở trên để cập nhật trạng thái lựa chọn tuyến đường trong
MediaRouter
.
Trạng thái không có thiết bị
Nếu bạn tạo hộp thoại Truyền tuỳ chỉnh,
MediaRouteChooserDialog
phải xử lý đúng cách trường hợp không có thiết bị nào bị
đã tìm thấy. Hộp thoại phải có các chỉ báo giúp người dùng biết rõ khi
ứng dụng vẫn đang cố gắng tìm thiết bị và khi nỗ lực khám phá không
hoạt động lâu hơn.
Nếu bạn đang sử dụng MediaRouteChooserDialog
mặc định, trạng thái 0 của thiết bị
đã được xử lý.
Các bước tiếp theo
Đến đây là các tính năng mà bạn có thể thêm vào ứng dụng Android Sender của mình. Giờ đây, bạn có thể tạo ứng dụng gửi cho một nền tảng khác (iOS hoặc Web) hoặc tạo ứng dụng Trình nhận web.