광고 시점
Android Sender SDK는 표시됩니다.
자세한 내용은 자세한 내용은 웹 수신기 광고 시점 개요를 참고하세요. 광고 시점 작동 방식에 관한 정보를 확인하세요
발신자와 수신자 모두에게 휴식 시간을 지정할 수 있지만 Web Receiver에 지정되어 있어야 하며 일관성을 유지하기 위한 Android TV 수신기 파악할 수 있습니다
Android에서는
AdBreakClipInfo
드림
및 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);
맞춤 작업 추가
발신기 앱은
MediaIntentReceiver
드림
맞춤 작업을 처리하거나 해당 동작을 재정의할 수 있습니다.
MediaIntentReceiver
을 사용하려면 이를 매니페스트에 추가하고
CastMediaOptions
의 이름을 지정합니다. 이 예시에서는 사용자가 확인할 수 있는
재정의, 원격 미디어 재생, 미디어 버튼 누르기, 기타 유형
확인할 수 있습니다
// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
<ph type="x-smartling-placeholder">// 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) { } }
맞춤 채널 추가
발신기 앱이 수신자 앱과 통신하려면 앱이 다음 조건을 충족해야 합니다.
맞춤 채널을 만들 수 있습니다. 발신자는 맞춤 채널을 사용하여 문자열을 전송할 수 있습니다.
전송합니다. 각 맞춤 채널은 고유한
네임스페이스에 포함되고 urn:x-cast:
접두사로 시작해야 합니다. 예를 들면 다음과 같습니다.
urn:x-cast:com.example.custom
여러 개의 커스텀
채널마다 고유한 네임스페이스를 갖습니다. 수신기 앱은
메시지 주고받기
동일한 네임스페이스를 사용하여
추가할 수 있습니다
맞춤 채널은
Cast.MessageReceivedCallback
드림
인터페이스에 추가되었습니다.
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); } }
발신기 앱이 수신 앱에 연결되면 맞춤 채널에서
컨테이너는
setMessageReceivedCallbacks
드림
메서드를 사용하여 축소하도록 요청합니다.
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); }
맞춤 채널이 생성되면 발신자가
sendMessage
드림
메서드를 사용하여 해당 채널을 통해 수신자에게 문자열 메시지를 전송합니다.
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); } } }
자동재생 지원
UX 위젯의 이미지 선택 재정의
프레임워크의 다양한 구성요소 (즉, 전송 대화상자, 미니
컨트롤러, UIMediaController(구성된 경우)에 아트워크가 표시됨
현재 전송 중인 미디어에
액세스할 수 있습니다 이미지 아트워크의 URL은 일반적으로
미디어의 MediaMetadata
에 포함되어 있지만 발신기 앱에
URL의 대체 소스를 제공합니다.
이
ImagePicker
드림
클래스는 이미지 목록에서 적절한 이미지를 선택하는 방법을 정의합니다.
이미지 사용에 따른 MediaMetadata
(예: 알림)
썸네일 또는 전체 화면 배경 기본 ImagePicker
구현
는 항상 첫 번째 이미지를 선택하거나
MediaMetadata
앱은 ImagePicker
를 서브클래스로 분류하고
onPickImage(MediaMetadata, ImageHints)
메서드를 사용하여 대체 구현을 제공하고 해당 서브클래스를
다음 코드로 교체합니다.
setImagePicker
CastMediaOptions.Builder
의 메서드
ImageHints
드림
지정할 이미지의 유형과 크기에 관한 힌트를 ImagePicker
에 제공합니다.
UI에 표시하도록 선택되어 있습니다.
Cast 대화상자 맞춤설정
세션 수명 주기 관리
SessionManager
드림
세션 수명 주기를 관리하는 중심 공간입니다. SessionManager
감상
Android로
MediaRouter
경로 선택 상태가 세션 시작, 재개, 종료로 변경됩니다. 경로가
선택하면 SessionManager
에서
Session
객체를 시작하고 재개하거나 재개하려고 시도합니다. 경로를 선택하지 않으면
SessionManager
는 현재 세션을 종료합니다.
따라서 SessionManager
에서 세션 수명 주기를 올바르게 관리하도록 하려면
다음을 확인해야 합니다.
- 경로 선택기 대화상자에서 다음을 수행합니다.
통화
MediaRouter.selectRoute(MediaRouter.RouteInfo)
사용자가 기기를 선택할 때 - 경로 컨트롤러 대화상자 (연결된
상태 또는
전송
state),
통화
MediaRouter.unselect(int)
사용자가 전송을 중지할 때
전송 대화상자를 만드는 방법에 따라 추가 작업이 필요할 수 있습니다. 완료:
- 다음을 사용하여 전송 대화상자를 만드는 경우
MediaRouteChooserDialog
드림 및MediaRouteControllerDialog
님, 그러면 이러한 대화상자는MediaRouter
에서 경로 선택을 자동으로 업데이트합니다. 별도의 조치가 필요하지 않습니다. - 다음을 사용하여 전송 버튼을 설정하는 경우
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
또는CastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, 대화상자가 실제로MediaRouteChooserDialog
및MediaRouteControllerDialog
을 사용하여 만들었으므로 또한 아무것도 할 필요가 없습니다. - 그 외의 경우에는 맞춤 전송 대화상자를 만들게 되므로
위의 안내에 따라
MediaRouter
기기 상태 0개
맞춤 전송 대화상자를 만드는 경우
MediaRouteChooserDialog
는 기기가 0개가 아닌 경우 이를 올바르게 처리해야 합니다.
발견. 대화상자에는
앱에서 여전히 기기를 찾으려고 시도 중이고 검색 시도가 검색 시도가 아닐 때
더 오래 활동합니다.
기본 MediaRouteChooserDialog
를 사용하는 경우 기기 0개가 상태임
이미 처리되고 있습니다.
다음 단계
이로써 Android Sender 앱에 추가할 수 있는 기능에 대한 설명을 마칩니다. 이제 다른 플랫폼용 발신기 앱을 빌드할 수 있습니다 (iOS 또는 웹) 웹 수신기 앱을 빌드합니다.