Migrer l'application CCL Sender vers le framework d'application Cast (CAF)

La procédure suivante vous permet de convertir votre application émettrice Android SDK Cast v2 avec CCL sur CAF. Toutes les fonctionnalités du CCL implémentée dans CAF. Une fois la migration effectuée, vous n'aurez donc plus besoin d'utiliser CCL.

Le SDK Cast CAF Sender utilise CastContext pour gérer le client GoogleAPIClient en votre nom. CastContext gère pour vous les cycles de vie, les erreurs et les rappels, ce qui permet simplifie le développement d'une application Cast.

Introduction

  • Comme la conception de l'expéditeur CAF a été influencée par la bibliothèque Cast Companion, la la migration de CCL vers CAF Sender implique principalement des mappages un à un et leurs méthodes.
  • L'expéditeur CAF est toujours distribué dans le cadre des services Google Play à l'aide d'Android SDK Manager.
  • Nouveaux packages (com.google.android.gms.cast.framework.*) qui ont été ajouté à CAF Sender, avec une fonctionnalité semblable à celle du CCL, la responsabilité du respect des Checklist de conception pour Google Cast
  • CAF Sender fournit des widgets conformes aux exigences de l'expérience utilisateur Cast. ces widgets sont similaires à ceux fournis par CCL.
  • L'expéditeur CAF fournit des rappels asynchrones semblables à CCL, pour suivre états et obtenir des données. Contrairement à CCL, CAF Sender ne fournit aucune opération no-op les implémentations des différentes méthodes d'interface.

Dans les sections suivantes, nous nous concentrerons principalement d'applications basées sur VideoCastManager de CCL, mais dans de nombreux cas, s'appliquent également à DataCastManager.

Dépendances

CCL et CAF ont les mêmes dépendances sur la bibliothèque Support AppCompat, Bibliothèque Support MediaRouter v7 et services Google Play. Toutefois, la différence est que CAF dépend du nouveau framework Cast disponible dans Google Play 9.2.0 ou version ultérieure.

Dans votre fichier build.gradle, supprimez les dépendances com.google.android.gms:play-services-cast et com.google.android.libraries.cast.companionlibrary:ccl, puis ajoutez le nouveau framework 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'
}

Vous pouvez également supprimer les métadonnées du service Google Play:

<meta‐data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>

Tous les services, activités et ressources qui font partie du CAF sont automatiquement fusionné avec le fichier manifeste et les ressources de votre application.

La version minimale du SDK Android compatible avec CAF est la version 9 (Gingerbread); La version minimale du SDK Android de CCL est la version 10.

Le CCL offre une méthode pratique, BaseCastManager.checkGooglePlayServices(activity), pour vérifier qu'une configuration des services Google Play est disponible sur l'appareil. CAF ne fait pas dans le SDK Cast. Suivre la procédure Vérifier que les appareils disposent du fichier APK des services Google Play pour s'assurer que le bon APK des services Google Play est installé sur le car il est possible que les mises à jour ne touchent pas tous les utilisateurs immédiatement.

Vous devez toujours utiliser une variante de Theme.AppCompat pour le d'un thème.

Initialisation

Pour CCL, VideoCastManager.initialize() devait être appelé dans le onCreate() de l'instance Applications. Cette logique doit être du code de votre classe Application.

Dans CAF, une étape d'initialisation explicite est également requise pour la conversion. d'infrastructure. Cela implique d'initialiser le singleton CastContext à l'aide d'un le OptionsProvider approprié pour spécifier l'ID d'application du récepteur et toute d'autres options globales. CastContext joue un rôle semblable à CCL VideoCastManager en fournissant un singleton avec lequel les clients interagissent. Le OptionsProvider est semblable à CastConfiguration de CCL pour vous permettre pour configurer les fonctionnalités du framework Cast.

Si votre CCL CastConfiguration.Builder actuel se présente comme suit:

VideoCastManager.initialize(
   getApplicationContext(),
   new CastConfiguration.Builder(context.getString(R.string.app_id))
       .enableWifiReconnection()
       .enableAutoReconnect()
       .build());

Puis dans CAF le CastOptionsProvider suivant à l'aide de CastOptions.Builder serait similaire:

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;
    }
}

Consultez notre application exemple. pour une implémentation complète d'OptionsProvider.

Déclarez le fournisseur d'options dans le champ "application". du composant Fichier 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>

Initialisez de manière différée CastContext dans la méthode onCreate de chaque Activity (et non l'instance Application):

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

Pour accéder au singleton CastContext, utilisez:

mCastContext = CastContext.getSharedInstance(this);

Détection d'appareils

Les incrementUiCounter et decrementUiCounter du CCL VideoCastManager doivent être supprimé des méthodes onResume et onPause de votre Activities.

Dans CAF, le processus de découverte est lancé et arrêté automatiquement par quand l'application passe au premier plan et en arrière-plan, respectivement.

Icône Cast et boîte de dialogue "Caster"

Comme pour CCL, ces composants sont fournis par le service bibliothèque.

L'icône Cast est toujours implémentée par MediaRouteButton et peut être ajoutée à votre activité (à l'aide d'un ActionBar ou d'un Toolbar), comme élément de menu. dans votre menu.

La déclaration de MediaRouteActionProvider dans le fichier XML du menu est la même que avec 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"/>

Comme pour CCL, remplacer la méthode onCreateOptionMenu() de chaque activité, mais au lieu d'utiliser CastManager.addMediaRouterButton, utilisez CastButtonFactory de CAF pour connecter MediaRouteButton au framework 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;
}

Contrôle des appareils

Comme pour CCL, dans CAF, le contrôle des appareils est largement géré par le framework. L'application émettrice n'a pas besoin de gérer, et ne doit pas essayer de la gérer. en se connectant à l'appareil et en lançant l'application réceptrice à l'aide de GoogleApiClient

L'interaction entre l'expéditeur et le destinataire est désormais représentée sous la forme d'une "session". La La classe SessionManager gère le cycle de vie de la session et démarre automatiquement et arrête les sessions en réponse aux gestes de l'utilisateur: une session démarre lorsque le L'utilisateur sélectionne un appareil Cast dans la boîte de dialogue "Caster" et s'arrête lorsqu'il appuie dessus. "Arrêter la diffusion" dans la boîte de dialogue Cast ou lorsque l'application émettrice elle-même se termine.

Dans CCL, vous devez étendre la classe VideoCastConsumerImpl pour suivre la distribution. État de la session:

private final VideoCastConsumer mCastConsumer = new VideoCastConsumerImpl() {
  public void onApplicationConnected(ApplicationMetadata appMetadata, 
                                     String sessionId,
                                     boolean wasLaunched) {}
  public void onDisconnectionReason(int reason) {}
  public void onDisconnected() {}
}

Dans CAF, l’application émettrice peut être informée des événements de cycle de vie d’une session en l'enregistrement d'un SessionManagerListener avec SessionManager. La Les rappels SessionManagerListener définissent des méthodes de rappel pour toutes les sessions des événements de cycle de vie.

Les méthodes SessionManagerListener suivantes sont mappées à partir de CCL Interface VideoCastConsumer:

  • VideoCastConsumer.onApplicationConnected -> SessionManagerListener.onSessionStarted
  • VideoCastConsumer.onDisconnected -> SessionManagerListener.onSessionEnded

Déclarez une classe qui implémente l'interface SessionManagerListener, puis déplacez la logique VideoCastConsumerImpl aux méthodes de correspondance:

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) {}
  ...
}

La classe CastSession représente une session avec un appareil Cast. La classe a pour contrôler le volume de l'appareil et couper le son, ce que CCL fait dans le BaseCastManager

Au lieu d'utiliser le CCL VideoCastManager pour ajouter un consommateur:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

Enregistrez maintenant votre SessionManagerListener:

mCastSessionManager = 
    CastContext.getSharedInstance(this).getSessionManager();
mCastSessionManagerListener = new CastSessionManagerListener();
mCastSessionManager.addSessionManagerListener(mCastSessionManagerListener,
                  CastSession.class);

Pour arrêter d'écouter des événements dans CCL:

VideoCastManager.getInstance().removeVideoCastConsumer(mCastConsumer);

Utilisez maintenant SessionManager pour arrêter d'écouter les événements de session:

mCastSessionManager.removeSessionManagerListener(mCastSessionManagerListener,
                    CastSession.class);

Pour vous déconnecter explicitement de l'appareil Cast, CCL a utilisé la commande suivante:

VideoCastManager.disconnectDevice(boolean stopAppOnExit, 
            boolean clearPersistedConnectionData,
            boolean setDefaultRoute)

Pour CAF, utilisez SessionManager:

CastContext.getSharedInstance(this).getSessionManager()
                                   .endCurrentSession(true);

Pour déterminer si l'expéditeur est connecté au destinataire, le CCL fournit VideoCastManager.getInstance().isConnected(), mais dans CAF, utilisez SessionManager:

public boolean isConnected() {
    CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                  .getSessionManager()
                                  .getCurrentCastSession();
    return (castSession != null && castSession.isConnected());
}

Dans CAF, les notifications de changement d'état du volume ou du son sont toujours envoyées par rappel dans Cast.Listener. ces écouteurs sont enregistrés CastSession Toutes les autres notifications d'état de l'appareil sont envoyées via Rappels CastStateListener ces écouteurs sont enregistrés CastSession Veillez à toujours annuler l'enregistrement des écouteurs lorsque la classe les fragments, les activités ou les applications sont mis en arrière-plan.

Logique de reconnexion

CAF tente de rétablir les connexions réseau qui sont perdues en raison en cas de perte temporaire du signal Wi-Fi ou d'autres erreurs réseau. Cette opération s'effectue désormais au niveau de la session ; une session peut indiquer "suspendue" lorsque la connexion est est perdu et reviendra à un mode "connecté" lorsque la connectivité est ont été restaurées. Le framework se charge de se reconnecter à l'application réceptrice et reconnecter les chaînes Cast.

CAF fournit son propre service de reconnexion, ce qui vous permet de supprimer Le CCL ReconnectionService depuis votre fichier manifeste:

<service android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>

Vous n'avez pas non plus besoin des autorisations suivantes dans votre fichier manifeste pour logique de reconnexion:

<uses‐permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses‐permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Le service de reconnexion CAF est activé par défaut, mais vous pouvez le désactiver à l'aide de la CastOptions

De plus, CAF ajoute aussi la reprise de session automatique qui est activée par par défaut (et peut être désactivé via CastOptions). Si l'application émettrice est envoyés en arrière-plan ou arrêtés (en balayant l'écran ou en raison d'un plantage) lorsqu'une session Cast est en cours, le framework tente de la reprendre. lorsque l'application émettrice revient au premier plan ou est relancée ; ceci est géré automatiquement par SessionManager, qui émet les rappels appropriés sur toutes les instances SessionManagerListener enregistrées.

Enregistrement d'un critère personnalisé

CCL propose deux méthodes pour créer un canal de message personnalisé destiné au destinataire:

  • CastConfiguration vous permet de spécifier plusieurs espaces de noms. CCL puis créez la chaîne pour vous.
  • DataCastManager est semblable à VideoCastManager, mais se concentre sur les contenus non multimédias différents cas d'utilisation.

Le CAF ne supporte pas l'une de ces méthodes de création de critères personnalisés, de suivre la procédure Ajouter un critère personnalisé pour votre application émettrice.

Comme pour CCL, pour les applications multimédias, il n'est pas nécessaire de définir explicitement enregistrer le canal Media Control.

Commande multimédia

Dans CAF, la classe RemoteMediaClient équivaut à VideoCastManager. méthodes média. RemoteMediaClient.Listener équivaut à VideoCastConsumer. En particulier, onRemoteMediaPlayerMetadataUpdated et onRemoteMediaPlayerStatusUpdated de VideoCastConsumer correspond à onMetadataUpdated et onStatusUpdated de RemoteMediaClient.Listener, respectivement:

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() {
    }
}

Il n'est pas nécessaire d'initialiser ni d'enregistrer explicitement le RemoteMediaClient. object; le framework instancie automatiquement l'objet et enregistre canal multimédia sous-jacent au début de la session si l'application réceptrice connecté à prend en charge l'espace de noms multimédia.

RemoteMediaClient est accessible en tant que méthode getRemoteMediaClient de l'objet CastSession.

CastSession castSession = CastContext.getSharedInstance(mAppContext)
                                     .getSessionManager()
                                     .getCurrentCastSession();
mRemoteMediaClient = castSession.getRemoteMediaClient();
mRemoteMediaClientListener = new CastMediaClientListener();

Au lieu des CCL:

VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer);

Utilisez maintenant CAF:

mRemoteMediaClient.addListener(mRemoteMediaClientListener);

N'importe quel nombre d'écouteurs peut être enregistré avec RemoteMediaClient, ce qui permet à plusieurs composants expéditeur de partager l'instance unique de RemoteMediaClient associé à la session.

Le VideoCastManager de CCL fournit des méthodes pour gérer la lecture des contenus multimédias:

VideoCastManager manager = VideoCastManager.getInstance();
if (manager.isRemoteMediaLoaded()) {
    manager.pause();
    mCurrentPosition = (int) manager.getCurrentMediaPosition();
}

Ceux-ci sont désormais implémentés par RemoteMediaClient dans CAF:

if (mRemoteMediaClient.hasMediaSession()) {
    mRemoteMediaClient.pause();
    mCurrentPosition = 
        (int)mRemoteMediaClient.getApproximateStreamPosition();
}

Dans CAF, toutes les requêtes média émises sur RemoteMediaClient renvoient un RemoteMediaClient.MediaChannelResult via un rappel PendingResult qui permet de suivre l'avancement et le résultat final de la demande.

CCL et CAF utilisent tous deux les classes MediaInfo et MediaMetadata pour représenter et pour charger des éléments multimédias.

Pour charger du contenu multimédia dans CCL, VideoCastManager est utilisé:

VideoCastManager.getInstance().loadMedia(media, autoPlay, mCurrentPosition, customData);

Dans CAF, RemoteMediaClient permet de charger le contenu multimédia:

mRemoteMediaClient.load(media, autoPlay, mCurrentPosition, customData);

Pour obtenir les informations Media et l'état d'une session multimédia en cours sur la récepteur, le CCL utilise le VideoCastManager:

MediaInfo mediaInfo = VideoCastManager.getInstance()
                                      .getRemoteMediaInformation();
int status = VideoCastManager.getInstance().getPlaybackStatus();
int idleReason = VideoCastManager.getInstance().getIdleReason();

Dans CAF, utilisez RemoteMediaClient pour obtenir les mêmes informations:

MediaInfo mediaInfo = mRemoteMediaClient.getMediaInfo();
int status = mRemoteMediaClient.getPlayerState();
int idleReason = mRemoteMediaClient.getIdleReason();

Message d'annonce en superposition

Semblable au CCL, CAF fournit une vue personnalisée IntroductoryOverlay pour mettre en évidence l'icône Cast lorsqu'elle s'affiche pour la première fois.

Au lieu d'utiliser la méthode onCastAvailabilityChanged VideoCastConsumer de CCL pour savoir quand afficher la superposition, déclarez un CastStateListener pour déterminer lorsque l'icône Cast s'affiche, dès lors que des appareils Cast sont détectés sur le réseau local par 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);
    ...
}

Effectuez le suivi de l'instance 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;
}

Vérifiez si MediaRouteButton est visible afin que la superposition d'introduction soit visible. peut être affichée:

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();
            }
        });
    }
}

Consultez notre application exemple pour obtenir le code fonctionnel complet permettant d'afficher la superposition de présentation.

Pour personnaliser le style de la superposition d'introduction, suivez la procédure ci-dessous : Personnalisez la superposition d'introduction.

Mini-télécommande

Au lieu du MiniController CCL, utilisez le MiniControllerFragment de CAF dans votre fichier de mise en page des activités dans lesquelles vous souhaitez afficher le mini contrôleur:

<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 n'est pas compatible avec la configuration manuelle compatible avec le MiniController de CCL Il n'est pas non plus compatible avec la fonctionnalité Autoplay.

Pour personnaliser le style et les boutons de la mini-télécommande, suivez les instructions procédure Personnalisez la mini-télécommande.

Notifications et écran de verrouillage

Semblable au VideoCastNotificationService du CCL, CAF fournit MediaNotificationService pour gérer l'affichage des notifications multimédias pendant la diffusion.

Vous devez supprimer les éléments suivants de votre fichier manifeste:

  • VideoIntentReceiver
  • VideoCastNotificationService

CCL permet de fournir un service de notification personnalisé avec CastConfiguration.Builder; qui n'est pas prise en charge par CAF.

Prenons l'exemple d'initialisation CastManager suivant à l'aide de CCL:

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());

Pour la configuration équivalente dans CAF, le SDK fournit NotificationsOptions.Builder pour vous aider à concevoir des commandes multimédias pour le notification et l'écran de verrouillage dans l'application émettrice. La notification et le verrouillage les commandes d'écran peuvent être activées avec CastOptions lors de l'initialisation 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();
}

Les notifications et les commandes de l'écran de verrouillage sont toujours activées dans CAF. Notez également que les boutons lecture/pause et arrêt de la diffusion sont fournis par défaut. CAF suit automatiquement la visibilité des activités quand afficher la notification multimédia, sauf pour Gingerbread. (Pour Gingerbread, consultez la note précédente sur avec registerLifecycleCallbacksBeforeIceCreamSandwich() ; CCL VideoCastManager d'appels incrementUiCounter et decrementUiCounter doit être supprimé.)

Pour personnaliser les boutons affichés dans les notifications, suivez les procédure Ajoutez des commandes multimédias aux notifications et à l'écran de verrouillage.

Télécommande agrandie

CCL fournit les éléments VideoCastControllerActivity et VideoCastControllerFragment pour afficher une télécommande agrandie lorsque vous castez du contenu multimédia.

Vous pouvez supprimer la déclaration VideoCastControllerActivity dans le fichier manifeste.

En CAF, vous devez développer ExpandedControllerActivity et ajouter l'icône Cast.

Pour personnaliser les styles et les boutons affichés dans la vue développée suivez la procédure Personnaliser le contrôleur étendu

Priorité audio

Comme pour CCL, la priorité audio est gérée automatiquement.

Réglage du volume

Pour Gingerbread, dispatchKeyEvent est obligatoire comme pour CCL. Dans ICS et les versions ultérieures pour le contrôle du volume CCL et CAF est géré automatiquement.

CAF permet de contrôler le volume de diffusion à l'aide du bouton de volume fort de l'appareil téléphone dans les activités de vos applications et affiche également une barre de volume visuelle lorsque la diffusion sur les versions compatibles. Le CAF gère aussi les changements de volume volume élevé même si votre application n'est pas au premier plan, est verrouillée ou même si l'écran désactivée.

Sous-titres

Dans Android KitKat et versions ultérieures, vous pouvez personnaliser les sous-titres à l'aide de l'option "Sous-titres". Paramètres, sous Paramètres > Accessibilité. Les versions antérieures d'Android, n'ont pas cette possibilité. CCL s'en charge en fournissant paramètres des versions antérieures et délégation aux paramètres système sur KitKat et versions supérieures.

Le fichier CAF ne fournit pas de paramètres personnalisés permettant de modifier les préférences des sous-titres. Toi doit supprimer les références CaptionsPreferenceActivity dans votre fichier manifeste et le fichier XML de vos préférences.

Le TracksChooserDialog du CCL n'est plus nécessaire depuis la modification de la valeur les pistes de sous-titres sont gérées par l'UI étendue de la manette.

L'API de sous-titrage dans CAF est semblable à la version 2.

Consignation des données de débogage

CAF ne fournit pas de paramètres de journalisation de débogage.

Divers :

Les fonctionnalités CCL suivantes ne sont pas compatibles avec CAF:

  • Obtenir une autorisation avant la lecture en fournissant un MediaAuthService
  • Messages d'interface utilisateur configurables

Applications exemples

Consultez la diff pour migrer notre application exemple Universal Music Player for Android (uamp) de CCL vers CAF.

Nous proposons également des tutoriels d'atelier de programmation et des exemples d'applications qui utilisent CAF.