다음 절차를 통해 Android 발신기 앱을 CCL을 포함하는 Cast SDK v2를 CAF로 전송합니다. CCL의 모든 기능은 지금까지 CAF에 구현되어 있으므로 이전한 후에는 더 이상 CCL을 사용할 필요가 없습니다.
Cast CAF 발신자 SDK는 CastContext를 사용하여 사용자 대신 GoogleAPIClient를 관리합니다. CastContext는 수명 주기, 오류, 콜백을 자동으로 관리하므로 Cast 앱 개발을 간소화할 수 있습니다.
소개
- CAF 발신자 디자인은 Cast 컴패니언 라이브러리의 영향을 받았기 때문에 CCL에서 CAF 발신자로 이전하는 데는 대부분 클래스와 그 메서드를 지원합니다.
- CAF 발신자는 계속 Google Play 서비스의 일부로 배포됩니다. Android SDK Manager를 사용하는 것입니다
- 새 패키지 (
com.google.android.gms.cast.framework.*
개)가 CCL과 유사한 기능을 가진 CAF 발신자에 추가되며, Google Cast 디자인 체크리스트 - CAF 발신자는 Cast UX 요구사항을 준수하는 위젯을 제공합니다. 이러한 위젯은 CCL에서 제공하는 위젯과 유사합니다.
- CAF 발신자는 CCL과 유사한 비동기 콜백을 제공하여 데이터를 가져올 수 있습니다. CCL과 달리 CAF 발신자는 노옵스(no-ops)를 제공하지 않으며 다양한 인터페이스 메서드의 구현입니다.
다음 섹션에서는 주로 동영상 중심 기반으로 하지만 대부분의 경우 동일한 DataCastManager에도 적용됩니다.
종속 항목
CCL 및 CAF는 AppCompat 지원 라이브러리에서 동일한 종속 항목을 갖습니다. MediaRouter v7 지원 라이브러리 및 Google Play 서비스입니다. 그러나 CAF는 Google Play에서 사용 가능한 새로운 Cast 프레임워크에 따라 서비스 9.2.0 이상이 필요합니다.
build.gradle 파일에서
com.google.android.gms:play-services-cast
및
com.google.android.libraries.cast.companionlibrary:ccl
,
그런 다음 새 Cast 프레임워크를 추가합니다.
dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:mediarouter-v7:23.4.0'
compile 'com.google.android.gms:play-services-cast-framework:9.4.0'
}
Google Play 서비스 메타데이터도 삭제할 수 있습니다.
<meta‐data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
CAF에 포함된 서비스, 활동, 리소스는 모두 자동으로 앱의 매니페스트 및 리소스와 병합됩니다.
CAF에서 지원하는 최소 Android SDK 버전은 9입니다. (Gingerbread); CCL의 최소 Android SDK 버전은 10입니다.
CCL은 편리한 방법을 제공합니다.
BaseCastManager.checkGooglePlayServices(activity)
)를 사용하여 호환되는
Google Play 서비스 버전을 사용할 수 있어야 합니다. CAF는
이를 Cast SDK의 일부로 제공해야 합니다. 절차 따르기
기기에 Google Play 서비스 APK가 있는지 확인
올바른 Google Play 서비스 APK가
업데이트가 모든 사용자에게 즉시 제공되지 않을 수 있기 때문입니다.
애플리케이션의 있습니다.
초기화
CCL의 경우 VideoCastManager.initialize()
는 다음에서 호출되어야 했습니다.
애플리케이션 인스턴스의 onCreate()
메서드 이 로직은
애플리케이션 클래스 코드에서 제거됩니다.
CAF에서는 Cast를 위한 명시적 초기화 단계도 필요합니다.
프레임워크입니다 이때 다음과 같이 CastContext
싱글톤을 초기화합니다.
수신기 애플리케이션 ID와 모든 ID를 지정하는 적절한 OptionsProvider
사용할 수 있습니다 CastContext
는 CCL의
클라이언트가 상호작용하는 싱글톤을 제공하여 VideoCastManager
합니다.
OptionsProvider
는 CCL의 CastConfiguration
와 유사하므로 다음을 실행할 수 있습니다.
을 사용하여 Cast 프레임워크 기능을 구성합니다.
현재 CCL CastConfiguration.Builder
이 다음과 같은 경우
VideoCastManager.initialize(
getApplicationContext(),
new CastConfiguration.Builder(context.getString(R.string.app_id))
.enableWifiReconnection()
.enableAutoReconnect()
.build());
그런 다음 CAF에서 CastOptions.Builder
를 사용하여 다음 CastOptionsProvider
를 실행합니다.
다음과 비슷합니다.
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;
}
}
샘플 앱 살펴보기 를 참조하세요.
'application' 내에서 OptionsProvider 선언 요소의 AndroidManifest.xml 파일:
<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
를 느리게 초기화
(Application
인스턴스는 아님):
private CastContext mCastContext;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_browser);
setupActionBar();
mCastContext = CastContext.getSharedInstance(this);
}
CastContext
싱글톤에 액세스하려면 다음을 사용하세요.
mCastContext = CastContext.getSharedInstance(this);
기기 검색
CCL의 VideoCastManager
incrementUiCounter
및 decrementUiCounter
은(는) 다음을 충족해야 합니다.
Activities
의 onResume
및 onPause
메서드에서 삭제됩니다.
CAF에서 검색 프로세스는 파일 시스템에 의해 자동으로 시작 및 중지되고 프레임워크가 포그라운드로 나와 백그라운드로 이동하면 각각 1개의 값으로 사용합니다.
전송 버튼 및 전송 대화상자
CCL과 마찬가지로 이러한 구성요소는 MediaRouter v7 지원에서 제공됩니다. 있습니다.
전송 버튼은 여전히 MediaRouteButton
로 구현되며 추가할 수 있습니다.
(ActionBar
또는 Toolbar
를 사용하여) 활동을 메뉴 항목으로 추가
찾을 수 있습니다.
메뉴 XML의 MediaRouteActionProvider
선언은 다음과 동일합니다.
CCL 포함:
<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"/>
CCL과 마찬가지로 각 액티비티의 onCreateOptionMenu() 메서드를 재정의하지만, CastManager.addMediaRouterButton을 사용하는 대신 CAF의 CastButtonFactory를 사용합니다. MediaRouteButton을 Cast 프레임워크에 연결합니다.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
기기 제어
CCL과 마찬가지로 CAF에서는 기기 제어가 주로 프레임워크에 의해 처리됩니다.
발신자 애플리케이션은 이를 처리할 필요가 없고 처리하려고 시도해서는 안 됩니다.
장치에 연결하고 다음을 사용하여 수신기 애플리케이션을 시작
GoogleApiClient
발신자와 수신자 간의 상호작용이 이제 '세션'으로 표시됩니다. 이
SessionManager
클래스는 세션 수명 주기를 처리하고 자동으로 시작
사용자 동작에 응답하여 세션을 중지합니다. 즉, 사용자가
사용자가 전송 대화상자에서 Cast 기기를 선택하고 탭하면 종료됩니다.
'전송 중지' 전송 대화상자나 발신기 앱 자체에 표시되는 경우
종료됩니다
CCL에서 VideoCastConsumerImpl
클래스를 확장하여 캐스트를 추적해야 합니다.
세션 상태:
private final VideoCastConsumer mCastConsumer = new VideoCastConsumerImpl() {
public void onApplicationConnected(ApplicationMetadata appMetadata,
String sessionId,
boolean wasLaunched) {}
public void onDisconnectionReason(int reason) {}
public void onDisconnected() {}
}
CAF에서 발신기 애플리케이션은
SessionManager
에 SessionManagerListener
를 등록하는 중입니다. 이
SessionManagerListener 콜백은 모든 세션의 콜백 메서드를 정의함
수명 주기 이벤트를 지원합니다.
다음 SessionManagerListener
메서드는 CCL에서 매핑됩니다.
VideoCastConsumer
인터페이스:
VideoCastConsumer.onApplicationConnected
->SessionManagerListener.onSessionStarted
VideoCastConsumer.onDisconnected
->SessionManagerListener.onSessionEnded
SessionManagerListener
인터페이스를 구현하는 클래스를 선언하고 다음 이동:
VideoCastConsumerImpl
로직을 매칭 메서드에 추가합니다.
private class CastSessionManagerListener implements SessionManagerListener<CastSession> {
public void onSessionEnded(CastSession session, int error) {}
public void onSessionStarted(CastSession session, String sessionId) {}
public void onSessionEnding(CastSession session) {}
...
}
CastSession
클래스는 Cast 기기를 사용한 세션을 나타냅니다. 이 클래스에는
음소거 상태를 제어하는 메서드도 제공합니다.
BaseCastManager
CCL VideoCastManager
를 사용하는 대신 소비자를 추가합니다.
VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);
이제 SessionManagerListener
를 등록합니다.
mCastSessionManager =
CastContext.getSharedInstance(this).getSessionManager();
mCastSessionManagerListener = new CastSessionManagerListener();
mCastSessionManager.addSessionManagerListener(mCastSessionManagerListener,
CastSession.class);
CCL에서 이벤트 리슨을 중지하려면 다음 단계를 따르세요.
VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);
이제 SessionManager
를 사용하여 세션 이벤트 리슨을 중지합니다.
mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
CastSession.class);
Cast 기기에서 명시적으로 연결을 해제하기 위해 CCL은 다음을 사용했습니다.
VideoCastManager.disconnectDevice(boolean stopAppOnExit,
boolean clearPersistedConnectionData,
boolean setDefaultRoute)
CAF의 경우 SessionManager
를 사용합니다.
CastContext.getSharedInstance(this).getSessionManager()
.endCurrentSession(true);
발신자가 수신자와 연결되어 있는지 확인하기 위해 CCL은
VideoCastManager.getInstance().isConnected()
이지만 CAF에서는
SessionManager
:
public boolean isConnected() {
CastSession castSession = CastContext.getSharedInstance(mAppContext)
.getSessionManager()
.getCurrentCastSession();
return (castSession != null && castSession.isConnected());
}
CAF에서 볼륨/음소거 상태 변경 알림은 여전히 콜백을 통해 전달됩니다.
Cast.Listener
의 메서드 이러한 리스너는
CastSession
입니다. 나머지 기기 상태 알림은 모두
CastStateListener
콜백 이러한 리스너는
CastSession
입니다. 관련 작업이 있을 때 여전히 리스너 등록을 취소해야 합니다.
프래그먼트, 활동 또는 앱이 백그라운드로 이동하는 경우
재연결 로직
CAF는 네트워크 연결을 다시 구성하려고 시도합니다. 일시적인 Wi-Fi 신호 손실 또는 기타 네트워크 오류가 발생할 수 있습니다. 이 작업은 이제 세션 수준 세션이 '정지됨' 상태로 전환되고 상태가 될 때 '연결' 상태로 전환됩니다. 연결 상태가 될 때 복원되었습니다. 프레임워크는 수신기 애플리케이션에 다시 연결하는 작업을 처리합니다. Cast 채널을 다시 연결하는 작업이 필요합니다.
CAF는 자체 재연결 서비스를 제공하므로
매니페스트에서 CCL ReconnectionService
를 삭제하면 됩니다.
<service android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>
또한 재연결 로직:
<uses‐permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/>
CAF 재연결 서비스는 기본적으로 사용 설정되어 있지만
CastOptions
또한 CAF는 자동 세션 재개를 추가하며 이 기능은
기본값이며 CastOptions
를 통해 비활성화할 수 있습니다. 발신자 애플리케이션이
백그라운드로 전송되거나 종료됨 (스와이프하거나 비정상 종료로 인해)
전송 세션이 진행되는 동안 프레임워크는 이 작업을 재개하려고
발신기 애플리케이션이 포그라운드로 돌아가거나 다시 시작될 때 세션
이는 SessionManager
에 의해 자동으로 처리되어
등록된 SessionManagerListener
인스턴스에 적절한 콜백을 사용해야 합니다.
맞춤 채널 등록
CCL은 수신자에게 맞춤 메시지 채널을 만드는 두 가지 방법을 제공합니다.
CastConfiguration
를 사용하면 여러 네임스페이스를 지정할 수 있으며 CCL은 채널을 만듭니다.DataCastManager
는 VideoCastManager와 유사하지만 미디어가 아닌 항목에 중점을 둡니다. 사용할 수 있습니다
CAF에서는 이러한 방법으로 맞춤 채널을 만들 수 없습니다. 대신 이 단계를 맞춤 채널 추가 발신기 앱에 표시됩니다.
CCL과 마찬가지로 미디어 애플리케이션의 경우 미디어 제어 채널을 등록합니다.
미디어 제어
CAF에서 RemoteMediaClient
클래스는 VideoCastManager
와 동일합니다.
미디어 메서드입니다. RemoteMediaClient.Listener
는 다음과 같습니다.
VideoCastConsumer
메서드와 함께 사용할 수 있습니다. 특히
onRemoteMediaPlayerMetadataUpdated
및 onRemoteMediaPlayerStatusUpdated
VideoCastConsumer
의 메서드는 onMetadataUpdated
에 매핑됩니다.
각각 RemoteMediaClient.Listener
의 onStatusUpdated
메서드:
private class CastMediaClientListener implements RemoteMediaClient.Listener {
@Override
public void onMetadataUpdated() {
setMetadataFromRemote();
}
@Override
public void onStatusUpdated() {
updatePlaybackState();
}
@Override
public void onSendingRemoteMediaRequest() {
}
@Override
public void onQueueStatusUpdated() {
}
@Override
public void onPreloadStatusUpdated() {
}
}
RemoteMediaClient
를 명시적으로 초기화하거나 등록할 필요가 없습니다.
object; 프레임워크는 자동으로 객체를 인스턴스화하고
수신 애플리케이션이
는 미디어 네임스페이스를 지원합니다.
RemoteMediaClient
는 다음의 getRemoteMediaClient
메서드로 액세스할 수 있습니다.
CastSession
객체
CastSession castSession = CastContext.getSharedInstance(mAppContext)
.getSessionManager()
.getCurrentCastSession();
mRemoteMediaClient = castSession.getRemoteMediaClient();
mRemoteMediaClientListener = new CastMediaClientListener();
CCL 대신:
VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);
이제 CAF를 사용합니다.
mRemoteMediaClient.addListener(mRemoteMediaClientListener);
RemoteMediaClient
에 리스너를 원하는 수만큼 등록할 수 있습니다.
이를 통해 여러 발신기 구성 요소가
세션과 연결된 RemoteMediaClient
입니다.
CCL의 VideoCastManager
는 미디어 재생을 처리하는 메서드를 제공합니다.
VideoCastManager manager = VideoCastManager.getInstance();
if (manager.isRemoteMediaLoaded()) {
manager.pause();
mCurrentPosition = (int) manager.getCurrentMediaPosition();
}
이는 이제 CAF의 RemoteMediaClient에 의해 구현됩니다.
if (mRemoteMediaClient.hasMediaSession()) {
mRemoteMediaClient.pause();
mCurrentPosition =
(int)mRemoteMediaClient.getApproximateStreamPosition();
}
CAF에서 RemoteMediaClient
에서 실행된 모든 미디어 요청은
PendingResult
콜백을 통한 RemoteMediaClient.MediaChannelResult
요청의 진행 상황과 최종 결과를 추적하는 데 사용할 수 있습니다.
CCL 및 CAF 모두 MediaInfo
및 MediaMetadata
클래스를 사용하여
사용하여 미디어를 로드할 수 있습니다.
CCL에서 미디어를 로드하려면 VideoCastManager
를 사용합니다.
VideoCastManager.getInstance().loadMedia(media, autoPlay, mCurrentPosition, customData);
CAF에서 RemoteMediaClient
는 미디어를 로드하는 데 사용됩니다.
mRemoteMediaClient.load(media, autoPlay, mCurrentPosition, customData);
현재 미디어 세션의 Media
정보와 상태를 가져오려면
CCL은 VideoCastManager
를 사용합니다.
MediaInfo mediaInfo = VideoCastManager.getInstance()
.getRemoteMediaInformation();
int status = VideoCastManager.getInstance().getPlaybackStatus();
int idleReason = VideoCastManager.getInstance().getIdleReason();
CAF에서 RemoteMediaClient
를 사용하여 동일한 정보를 가져옵니다.
MediaInfo mediaInfo = mRemoteMediaClient.getMediaInfo();
int status = mRemoteMediaClient.getPlayerState();
int idleReason = mRemoteMediaClient.getIdleReason();
소개 오버레이
CCL과 마찬가지로 CAF는 강조 표시할 맞춤 뷰 IntroductoryOverlay
를 제공합니다.
전송 버튼을 조작해야 합니다.
CCL의 VideoCastConsumer
onCastAvailabilityChanged
메서드를 사용하는 대신
오버레이 표시 시기를 알 수 있도록 CastStateListener
를 선언하여
전송 버튼이 표시되는 시점
로컬 네트워크를 MediaRouter
:
private IntroductoryOverlay mIntroductoryOverlay;
private MenuItem mMediaRouteMenuItem;
protected void onCreate(Bundle savedInstanceState) {
...
mCastStateListener = new CastStateListener() {
@Override
public void onCastStateChanged(int newState) {
if (newState != CastState.NO_DEVICES_AVAILABLE) {
showIntroductoryOverlay();
}
}
};
mCastContext = CastContext.getSharedInstance(this);
mCastContext.registerLifecycleCallbacksBeforeIceCreamSandwich(this,
savedInstanceState);
}
protected void onResume() {
mCastContext.addCastStateListener(mCastStateListener);
...
}
protected void onPause() {
mCastContext.removeCastStateListener(mCastStateListener);
...
}
MediaRouteMenuItem
인스턴스를 추적합니다.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.browse, menu);
mMediaRouteMenuItem = CastButtonFactory.setUpMediaRouteButton(
getApplicationContext(), menu,
R.id.media_route_menu_item);
showIntroductoryOverlay();
return true;
}
소개 오버레이에 MediaRouteButton
가 표시되는지 확인합니다.
다음과 같습니다.
private void showIntroductoryOverlay() {
if (mIntroductoryOverlay != null) {
mIntroductoryOverlay.remove();
}
if ((mMediaRouteMenuItem != null) && mMediaRouteMenuItem.isVisible()) {
new Handler().post(new Runnable() {
@Override
public void run() {
mIntroductoryOverlay = new IntroductoryOverlay.Builder(
VideoBrowserActivity.this, mMediaRouteMenuItem)
.setTitleText(getString(R.string.introducing_cast))
.setOverlayColor(R.color.primary)
.setSingleTime()
.setOnOverlayDismissedListener(
new IntroductoryOverlay
.OnOverlayDismissedListener() {
@Override
public void onOverlayDismissed() {
mIntroductoryOverlay = null;
}
})
.build();
mIntroductoryOverlay.show();
}
});
}
}
자세한 내용은 샘플 앱 를 참조하세요.
소개 오버레이의 스타일을 맞춤설정하려면 다음 절차를 따르세요. 도입 오버레이 맞춤설정.
미니 컨트롤러
CCL의 MiniController
대신 MiniControllerFragment
미니 앱을 표시하려는 활동의 앱 레이아웃 파일
컨트롤러:
<fragment
android:id="@+id/cast_mini_controller"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:castShowImageThumbnail="true"
android:visibility="gone"
class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />
CAF는 CCL의 MiniController
에서 지원되는 수동 구성을 지원하지 않습니다.
또한 Autoplay
기능을 지원하지 않습니다.
미니 컨트롤러의 스타일과 버튼을 맞춤설정하려면 시술 미니 컨트롤러 맞춤설정
알림 및 잠금 화면
CCL의 VideoCastNotificationService
와 마찬가지로 CAF는
MediaNotificationService
: 미디어 알림 표시 관리
변경할 수 있습니다.
매니페스트에서 다음을 삭제해야 합니다.
VideoIntentReceiver
VideoCastNotificationService
CCL은
CastConfiguration.Builder
할 수 있습니다.
CCL을 사용한 다음 CastManager
초기화를 고려하세요.
VideoCastManager.initialize(
getApplicationContext(),
new CastConfiguration.Builder(
context.getString(R.string.app_id))
.addNotificationAction(
CastConfiguration.NOTIFICATION_ACTION_PLAY_PAUSE,true)
.addNotificationAction(
CastConfiguration.NOTIFICATION_ACTION_DISCONNECT,true)
.build());
CAF의 해당 구성에 대해 SDK는
NotificationsOptions.Builder
를 사용하면
알림과 잠금 화면을 발신기 앱에 연결할 수 있습니다. 알림 및 도어락
화면 컨트롤을 초기화할 때 CastOptions
를 사용하여
CastContext
입니다.
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions =
new NotificationOptions.Builder()
.setActions(Arrays.asList(
MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{0, 1})
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(context.getString(R.string.app_id))
.setCastMediaOptions(mediaOptions)
.build();
}
알림 및 잠금 화면 컨트롤은 CAF에서 항상 사용 설정되어 있습니다. 또한
재생/일시중지 및 전송 중지 버튼이 기본적으로 제공됩니다. CAF
액티비티의 공개 상태를 자동으로 추적하여
Gingerbread를 제외하고 미디어 알림을 표시할 시기를 지정합니다.
(Gingerbread의 경우 이전 참고 사항을
registerLifecycleCallbacksBeforeIceCreamSandwich()
사용 CCL
VideoCastManager
incrementUiCounter
및 decrementUiCounter
호출
는 삭제해야 합니다.)
알림에 표시되는 버튼을 맞춤설정하려면 시술 알림 및 잠금 화면에 미디어 컨트롤 추가
확장 컨트롤러
CCL은 VideoCastControllerActivity
및 VideoCastControllerFragment
를 제공합니다.
미디어를 전송할 때 확장된 컨트롤러를 표시합니다.
매니페스트에서 VideoCastControllerActivity
선언을 삭제할 수 있습니다.
CAF에서는 ExtendedControllerActivity를 확장하고 전송 버튼을 추가합니다.
펼쳐진 확인 절차를 따르고, 확장 컨트롤러 맞춤설정
오디오 포커스
CCL과 마찬가지로 오디오 포커스는 자동으로 관리됩니다.
볼륨 제어
Gingerbread의 경우 CCL과 마찬가지로 dispatchKeyEvent
가 필요합니다. ICS 이상
CCL 및 CAF 볼륨 조절 모두 자동으로 처리됩니다.
CAF를 사용하면 기기에 있는 하드 볼륨 버튼으로 전송 볼륨을 제어할 수 있습니다. 통화할 수 있으며, 볼륨바를 시각적으로 표시합니다. 전송할 수 있습니다. CAF는 또한 앱이 전면에 있지 않거나 잠겨 있거나 화면이 꺼진 경우에도 사용 중지됩니다.
자막
Android KitKat 이상에서는 자막을 통해 자막을 맞춤설정할 수 있습니다. 설정(설정 > 접근성. Android의 이전 버전에서는 이러한 기능이 없습니다 CCL은 자체 API를 통해 이전 버전의 설정 및 KitKat의 시스템 설정에 위임 이상
CAF는 자막 환경설정을 변경할 수 있는 맞춤 설정을 제공하지 않습니다. 나
매니페스트에서 CaptionsPreferenceActivity
참조를 삭제해야 합니다
환경설정 XML입니다.
닫힌 도로 변경 이후 CCL의 TracksChooserDialog
이 더 이상 필요하지 않음
자막 트랙은 확장 컨트롤러 UI에 의해 처리됩니다.
자막 API v2와 비슷합니다.
디버그 로깅
CAF는 디버그 로깅 설정을 제공하지 않습니다.
기타
다음 CCL 기능은 CAF에서 지원되지 않습니다.
MediaAuthService
를 제공하여 재생 전에 승인 받기- 구성 가능한 UI 메시지
샘플 앱
Android용 유니버설 음악 플레이어 (uamp) 샘플 앱을 CCL에서 CAF로 이전하는 것과 관련된 차이점을 살펴보세요.
CAF를 사용하는 Codelab 튜토리얼 및 샘플 앱도 있습니다.