CCL 발신자 앱을 Cast 애플리케이션 프레임워크 (CAF)로 이전

다음 절차를 통해 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-castcom.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>

ActivityonCreate 메서드에서 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 incrementUiCounterdecrementUiCounter은(는) 다음을 충족해야 합니다. ActivitiesonResumeonPause 메서드에서 삭제됩니다.

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에서 발신기 애플리케이션은 SessionManagerSessionManagerListener를 등록하는 중입니다. 이 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 메서드와 함께 사용할 수 있습니다. 특히 onRemoteMediaPlayerMetadataUpdatedonRemoteMediaPlayerStatusUpdated VideoCastConsumer의 메서드는 onMetadataUpdated에 매핑됩니다. 각각 RemoteMediaClient.ListeneronStatusUpdated 메서드:

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 모두 MediaInfoMediaMetadata 클래스를 사용하여 사용하여 미디어를 로드할 수 있습니다.

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 incrementUiCounterdecrementUiCounter 호출 는 삭제해야 합니다.)

알림에 표시되는 버튼을 맞춤설정하려면 시술 알림 및 잠금 화면에 미디어 컨트롤 추가

확장 컨트롤러

CCL은 VideoCastControllerActivityVideoCastControllerFragment를 제공합니다. 미디어를 전송할 때 확장된 컨트롤러를 표시합니다.

매니페스트에서 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 튜토리얼샘플 앱도 있습니다.