다음 절차를 통해 Android 발신기 앱을 Cast SDK v2에서 CastContext 싱글톤을 기반으로 하는 CAF Sender로 변환할 수 있습니다.
Cast CAF 발신자 SDK는 CastContext를 사용하여 사용자를 대신하여 GoogleAPIClient를 관리합니다. CastContext는 수명 주기, 오류, 콜백을 관리하므로 Cast 앱 개발을 크게 단순화할 수 있습니다.
소개
- CAF 발신자는 Android SDK Manager를 사용하여 Google Play 서비스의 일부로 여전히 배포됩니다.
- Google Cast 디자인 체크리스트 (
com.google.android.gms.cast.framework.*
) 준수를 담당하는 새 패키지가 추가되었습니다. - CAF 발신자는 Cast UX 요구사항을 준수하는 위젯을 제공합니다. v2에서는 UI 구성요소를 제공하지 않았으며 이러한 위젯을 구현해야 합니다.
- Cast API를 사용하기 위해 더 이상 GoogleApiClient를 사용하지 않아도 됩니다.
- CAF 발신자의 자막 방송은 v2와 유사합니다.
종속 항목
V2와 CAF는 지원 라이브러리 기능 가이드에 설명된 대로 지원 라이브러리 및 Google Play 서비스 (9.2.0 이상)의 종속 항목이 동일합니다.
CAF가 지원하는 최소 Android SDK 버전은 9 (Gingerbread)입니다.
초기화
CAF에서는 Cast 프레임워크에 명시적인 초기화 단계가 필요합니다. 여기에는 웹 수신기 애플리케이션 ID 및 기타 전역 옵션을 지정하기 위해 적절한 OptionsProvider
를 사용하여 CastContext
싱글톤을 초기화하는 작업이 포함됩니다.
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return null;
}
}
앱 AndroidManifest.xml
파일의 'application' 태그 내에 OptionsProvider
를 선언합니다.
<application>
...
<meta-data
android:name=
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>
각 활동의 onCreate
메서드에서 CastContext
를 지연 초기화합니다.
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
v2에서는 이러한 단계가 필요하지 않았습니다.
기기 검색
CAF에서 탐색 프로세스는 앱이 포그라운드로 전환되고 백그라운드로 이동할 때 각각 프레임워크에 의해 자동으로 시작되고 중지됩니다. MediaRouteSelector
및 MediaRouter.Callback
는 사용해서는 안 됩니다.
전송 버튼 및 전송 대화상자
v2와 마찬가지로 이러한 구성요소는 MediaRouter 지원 라이브러리에서 제공됩니다.
전송 버튼은 여전히 MediaRouteButton
에 의해 구현되며 (ActionBar
또는 Toolbar
를 사용하여) 메뉴의 메뉴 항목으로 활동에 추가할 수 있습니다.
<item
android:id="@+id/media_route_menu_item"
android:title="@string/media_route_menu_title"
app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
app:showAsAction="always"/>
CastButtonFactory
를 사용하여 MediaRouteButton
를 Cast 프레임워크에 연결하여 각 활동의 onCreateOptionMenu()
메서드를 재정의합니다.
private MenuItem mediaRouteMenuItem;
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mediaRouteMenuItem =
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
누군가 버튼을 탭하면 전송 대화상자가 자동으로 표시됩니다.
기기 제어
CAF에서 기기 제어는 대체로 프레임워크에 의해 처리됩니다. 발신기 애플리케이션은 GoogleApiClient
를 사용하여 기기 연결과 Web Receiver 애플리케이션 실행을 처리할 필요가 없고 처리를 시도해서는 안 됩니다. 발신자와 Web Receiver 간의 상호작용이 이제 '세션'으로 표시됩니다. SessionManager
클래스는 세션 수명 주기를 처리하고 사용자 동작에 응답하여 세션을 자동으로 시작하고 중지합니다. 세션은 사용자가 전송 대화상자에서 Cast 기기를 선택할 때 시작되고, 사용자가 전송 대화상자에서 '전송 중지' 버튼을 탭하거나 발신기 앱 자체를 종료하면 종료됩니다. 발신자 애플리케이션은 SessionManager
에 SessionManagerListener
를 등록하여 세션 수명 주기 이벤트에 관한 알림을 받을 수 있습니다. SessionManagerListener
콜백은 모든 세션 수명 주기 이벤트의 콜백 메서드를 정의합니다.
CastSession
클래스는 Cast 기기가 있는 세션을 나타냅니다. 클래스에는 기기 볼륨과 음소거 상태를 제어하는 메서드가 있습니다. 이전에는 v2에서 Cast.CastApi
의 메서드를 사용하여 이 작업을 실행했습니다.
v2에서 Cast.Listener
콜백은 볼륨, 음소거 상태, 대기 상태 등 기기 상태 변경사항에 관한 알림을 제공했습니다.
CAF에서 볼륨/음소거 상태 변경 알림은 여전히 Cast.Listener
의 콜백 메서드를 통해 전달됩니다. 이러한 리스너는 CastSession
로 등록됩니다.
나머지 기기 상태 알림은 모두 CastStateListener
콜백을 통해 전달됩니다. 이러한 리스너는 CastSession
에 등록됩니다. 연결된 프래그먼트, 활동 또는 앱이 백그라운드로 전환될 때도 리스너 등록을 취소해야 합니다.
재연결 로직
v2와 마찬가지로 CAF는 일시적인 Wi-Fi 신호 손실 또는 기타 네트워크 오류로 인해 손실된 네트워크 연결을 다시 설정하려고 시도합니다. 이 작업은 이제 세션 수준에서 실행됩니다. 연결이 끊어지면 세션이 '정지됨' 상태로 전환되고 연결이 복원되면 '연결됨' 상태로 다시 전환됩니다. 프레임워크는 이 프로세스의 일부로 웹 수신기 애플리케이션에 다시 연결하고 Cast 채널을 다시 연결합니다.
또한 CAF는 기본적으로 사용 설정되며 CastOptions
를 통해 비활성화할 수 있는 자동 세션 재개도 추가합니다.
전송 세션이 진행되는 동안 발신기 애플리케이션이 백그라운드로 전송되거나 (스와이프하거나 비정상 종료로 인해) 종료된 경우 프레임워크는 발신기 애플리케이션이 포그라운드로 돌아가거나 다시 실행될 때 세션을 재개하려고 합니다. 이 작업은 SessionManager
에 의해 자동으로 처리됩니다. 이 작업은 등록된 SessionManagerListener
인스턴스에서 적절한 콜백을 실행합니다.
맞춤 채널 등록
v2에서 Cast.MessageReceivedCallback
를 사용하여 구현된 맞춤 채널은 Cast.CastApi
에 등록됩니다. 대신 CAF에서 맞춤 채널은 CastSession
인스턴스에 등록됩니다. 등록은 SessionManagerListener.onSessionStarted
콜백 메서드에서 실행할 수 있습니다. 미디어 애플리케이션의 경우 Cast.CastApi.setMessageReceivedCallbacks
를 통해 미디어 제어 채널을 명시적으로 등록할 필요가 없습니다. 자세한 내용은 다음 섹션을 참고하세요.
미디어 제어
v2 클래스 RemoteMediaPlayer
는 지원 중단되었으므로 사용해서는 안 됩니다. CAF에서는 새로운 RemoteMediaClient
클래스로 대체되며 이 클래스는 더 편리한 API로 동일한 기능을 제공합니다. 이 객체를 명시적으로 초기화하거나 등록할 필요는 없습니다. 연결된 웹 수신기 애플리케이션이 미디어 네임스페이스를 지원하는 경우 프레임워크는 세션 시작 시 자동으로 객체를 인스턴스화하고 기본 미디어 채널을 등록합니다.
RemoteMediaClient
는 CastSession
객체의 getRemoteMediaClient
메서드로 액세스할 수 있습니다.
v2에서는 RemoteMediaPlayer
에서 실행된 모든 미디어 요청이 PendingResult
콜백을 통해 RemoteMediaPlayer.MediaChannelResult
를 반환합니다.
CAF에서는 RemoteMediaClient
에서 실행된 모든 미디어 요청이 PendingResult
콜백을 통해 RemoteMediaClient.MediaChannelResult
를 반환하며, 이 콜백은 요청의 진행 상황과 최종 결과를 추적하는 데 사용할 수 있습니다.
v2 RemoteMediaPlayer
는 RemoteMediaPlayer.OnStatusUpdatedListener
를 통해 웹 수신기의 미디어 플레이어 상태 변경에 관한 알림을 전송합니다.
CAF에서 RemoteMediaClient
는 RemoteMediaClient.Listener
인터페이스를 통해 상응하는 콜백을 제공합니다. RemoteMediaClient
에는 리스너를 여러 개 등록할 수 있으므로 여러 발신자 구성요소가 세션과 연결된 RemoteMediaClient
의 단일 인스턴스를 공유할 수 있습니다.
v2에서는 발신자 애플리케이션이 사용자 인터페이스를 웹 수신기의 미디어 플레이어 상태와 동기화 상태로 유지하는 부담을 가져야 했습니다.
CAF에서 UIMediaController
클래스가 이러한 책임을 대부분 맡습니다.
소개 오버레이
V2에서는 소개 오버레이 UI를 제공하지 않습니다.
CAF는 맞춤 뷰 IntroductoryOverlay
를 제공하여 전송 버튼이 사용자에게 처음 표시될 때 이를 강조표시합니다.
미니 컨트롤러
v2에서는 발신기 앱에서 미니 컨트롤러를 처음부터 구현해야 합니다.
CAF에서 SDK는 미니 컨트롤러를 표시하려는 활동의 앱 레이아웃 파일에 추가할 수 있는 맞춤 뷰 MiniControllerFragment
를 제공합니다.
알림 및 잠금 화면
v2에서는 SDK에서 알림 및 잠금 화면용 컨트롤러를 제공하지 않습니다. 이 SDK의 경우 Android 프레임워크 API를 사용하여 발신기 앱에 이러한 기능을 빌드해야 합니다.
CAF에서 SDK는 발신기 앱에 알림 및 잠금 화면의 미디어 컨트롤을 빌드하는 데 도움이 되는 NotificationsOptions.Builder
를 제공합니다. CastContext
를 초기화할 때 알림 및 잠금 화면 컨트롤을 CastOptions
로 사용 설정할 수 있습니다.
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setTargetActivityClassName(VideoBrowserActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
확장 컨트롤러
v2에서는 발신기 앱에서 확장 컨트롤러를 처음부터 구현해야 합니다.
CAF는 자체 확장 컨트롤러를 쉽게 빌드할 수 있는 UIMediaController
도우미 클래스를 제공합니다.
CAF는 미리 빌드된 확장 컨트롤러 위젯 ExpandedControllerActivity
를 추가합니다. 이 위젯은 앱에 간단히 추가할 수 있습니다. 더 이상 UIMediaController
를 사용하여 확장 맞춤 컨트롤러를 구현할 필요가 없습니다.
오디오 포커스
v2에서는 MediaSessionCompat
를 사용하여 오디오 포커스를 관리해야 합니다.
CAF에서 오디오 포커스는 자동으로 관리됩니다.
디버그 로깅
CAF에는 로깅 옵션이 없습니다.
샘플 앱
CAF를 사용하는 Codelab 튜토리얼과 샘플 앱이 있습니다.