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.