다음 절차에 따라 Android 발신기 앱을 Cast SDK v2에서 CastContext 싱글톤을 기반으로 하는 CAF Sender로 변환할 수 있습니다.
Cast CAF Sender SDK는 CastContext를 사용하여 개발자를 대신하여 GoogleAPIClient를 관리합니다. CastContext는 수명 주기, 오류, 콜백을 자동으로 관리하므로 Cast 앱 개발이 크게 간소화됩니다.
소개
- CAF Sender는 여전히 Android SDK 관리자를 사용하여 Google Play 서비스의 일부로 배포됩니다.
- Google Cast 디자인 체크리스트를 준수하는 책임을 맡는 새 패키지가 추가되었습니다 (
com.google.android.gms.cast.framework.*
). - CAF Sender는 Cast UX 요구사항을 준수하는 위젯을 제공합니다. v2는 UI 구성요소를 제공하지 않았으며 이러한 위젯을 구현해야 했습니다.
- Cast API를 사용하기 위해 더 이상 GoogleApiClient를 사용할 필요가 없습니다.
- CAF Sender의 자막은 v2와 유사합니다.
종속 항목
V2와 CAF는 지원 라이브러리 기능 가이드에 설명된 대로 지원 라이브러리 및 Google Play 서비스 (9.2.0 이상)에 동일한 종속 항목이 있습니다.
CAF에서 지원하는 최소 Android SDK 버전은 9 (Gingerbread)입니다.
초기화
CAF에서는 Cast 프레임워크에 명시적 초기화 단계가 필요합니다. 여기에는 적절한 OptionsProvider
를 사용하여 웹 수신기 애플리케이션 ID 및 기타 글로벌 옵션을 지정하는 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>
각 Activity의 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
를 사용하여 각 Activity의 onCreateOptionMenu()
메서드를 재정의하여 MediaRouteButton
를 Cast 프레임워크에 연결합니다.
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
를 사용하여 웹 수신기 애플리케이션을 실행하는 작업을 처리할 필요가 없으며 처리하려고 시도해서는 안 됩니다. 이제 발신자와 웹 수신자 간의 상호작용이 '세션'으로 표시됩니다. SessionManager
클래스는 세션 수명 주기를 처리하고 사용자 동작에 응답하여 세션을 자동으로 시작 및 중지합니다. 세션은 사용자가 전송 대화상자에서 전송 기기를 선택하면 시작되고 사용자가 전송 대화상자에서 '전송 중지' 버튼을 탭하거나 발신자 앱 자체가 종료되면 종료됩니다. 발신자 애플리케이션은 SessionManager
에 SessionManagerListener
를 등록하여 세션 수명 주기 이벤트에 대한 알림을 받을 수 있습니다. SessionManagerListener
콜백은 모든 세션 수명 주기 이벤트의 콜백 메서드를 정의합니다.
CastSession
클래스는 Cast 기기의 세션을 나타냅니다. 이 클래스에는 기기 볼륨과 음소거 상태를 제어하는 메서드가 있습니다. 이전에는 v2에서 Cast.CastApi
의 메서드를 사용하여 이를 실행했습니다.
v2에서는 Cast.Listener
콜백이 볼륨, 음소거 상태, 대기 상태 등을 비롯한 기기 상태 변경 알림을 제공했습니다.
CAF에서는 볼륨/음소거 상태 변경 알림이 여전히 Cast.Listener
의 콜백 메서드를 통해 전송됩니다. 이러한 리스너는 CastSession
에 등록됩니다.
나머지 모든 기기 상태 알림은 CastStateListener
콜백을 통해 전송됩니다. 이러한 리스너는 CastSession
에 등록됩니다. 연결된 프래그먼트, 활동 또는 앱이 백그라운드로 전환되더라도 리스너를 등록 취소해야 합니다.
재연결 로직
v2와 마찬가지로 CAF는 일시적인 Wi-Fi 신호 손실 또는 기타 네트워크 오류로 인해 끊어진 네트워크 연결을 다시 설정하려고 시도합니다. 이제 세션 수준에서 이루어집니다. 세션은 연결이 끊어지면 '일시중지됨' 상태로 전환될 수 있으며 연결이 복원되면 '연결됨' 상태로 다시 전환됩니다. 프레임워크는 이 프로세스의 일환으로 웹 수신기 애플리케이션에 다시 연결하고 Cast 채널을 다시 연결합니다.
또한 CAF는 기본적으로 사용 설정되며 CastOptions
를 통해 비활성화할 수 있는 자동 세션 재개를 추가합니다.
전송 세션이 진행되는 동안 전송자 애플리케이션이 백그라운드로 전송되거나 스와이프하여 닫거나 비정상 종료로 인해 종료되면 프레임워크는 전송자 애플리케이션이 포그라운드로 돌아오거나 다시 실행될 때 해당 세션을 재개하려고 시도합니다. 이는 등록된 SessionManagerListener
인스턴스에서 적절한 콜백을 실행하는 SessionManager
에 의해 자동으로 처리됩니다.
맞춤 채널 등록
v2에서는 맞춤 채널 (Cast.MessageReceivedCallback
를 사용하여 구현됨)이 Cast.CastApi
에 등록됩니다. CAF에서는 맞춤 채널이 CastSession
인스턴스에 등록됩니다. 등록은 SessionManagerListener.onSessionStarted
콜백 메서드에서 할 수 있습니다. 미디어 애플리케이션의 경우 더 이상 Cast.CastApi.setMessageReceivedCallbacks
를 통해 미디어 컨트롤 채널을 명시적으로 등록할 필요가 없습니다. 자세한 내용은 다음 섹션을 참고하세요.
미디어 제어
v2 클래스 RemoteMediaPlayer
는 지원 중단되었으므로 사용해서는 안 됩니다. CAF에서는 더 편리한 API에서 동등한 기능을 제공하는 새로운 RemoteMediaClient
클래스로 대체되었습니다. 이 객체를 명시적으로 초기화하거나 등록할 필요는 없습니다. 연결되는 웹 수신기 애플리케이션이 미디어 네임스페이스를 지원하는 경우 프레임워크는 자동으로 객체를 인스턴스화하고 세션 시작 시 기본 미디어 채널을 등록합니다.
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 튜토리얼 및 샘플 앱이 있습니다.