L'intégration du composant de lecture vidéo dans une application mobile peut présenter des défis, notamment pour gérer les différents modes d'affichage et les interactions système. La version 10.3.3 du framework ChinaCock apporte des améliorations significatives au composant TCCSuperPlayerView, permettant une intégration plus fluide et complète. Cet article détaille l'implémentation des fonctionnalités clés de ce lecteur amélioré.
Gestion des événements de navigation
L'événement OnBackPress est déclenché lorsque l'utilisateur appuie sur le bouton retour intégré au lecteur. Le paramètre playMode indique le mode de lecture actuel (fenêtre, plein écran, flottant). Le paramètre handled permet au développeur de contréler si l'événement doit être traité ou non. Voici un exemple d'implémentation :
procedure TMediaForm.PlayerBackPress(Sender: TObject; playMode: TPlaybackMode;
var handled: Boolean);
begin
handled := False;
case playMode of
TPlaybackMode.WindowMode:
begin
MediaViewer.PausePlayback;
Close;
handled := True;
end;
TPlaybackMode.FullscreenMode:
begin
if Display.Orientation = TScreenOrientation.Portrait then
begin
MediaViewer.PausePlayback;
Close;
handled := True;
end;
end;
TPlaybackMode.FloatMode:
begin
// Traitement pour le mode flottant
end;
end;
end;
Dans ce code, lorsque le lecteur est en mode fenêtre ou en mode plein écran avec l'appareil en orientation portrait, l'action retour interrompt la lecture et ferme la vue.
Adaptation dynamique des modes de lecture
L'événement OnRequestPlayMode gère la transition entre les différents modes. Lors du passage en mode plein écran, l'application est mise en mode immersif et l'écran passe en orientation paysage. En mode fenêtre, l'orientation redevient portrait et l'application est mise en avant-plan.
procedure TMediaForm.MediaViewerRequestMode(Sender: TObject; requestedMode: TPlaybackMode);
begin
if requestedMode = TPlaybackMode.FullscreenMode then
begin
IsFullscreen := True;
MediaViewer.Parent := Self;
MediaViewer.Align := TAlignLayout.Contents;
Screen.Orientation := TScreenOrientation.Landscape;
end
else if requestedMode = TPlaybackMode.WindowMode then
begin
IsFullscreen := False;
MediaViewer.Parent := PlayerContainerLayout;
MediaViewer.Align := TAlignLayout.Contents;
BringAppToFront('com.example.myapp');
Screen.Orientation := TScreenOrientation.Portrait;
end
else if requestedMode = TPlaybackMode.FloatMode then
begin
SendAppToBackground;
end;
end;
Traitement du bouton retour matériel
Pour une gestion cohérente, il faut intercepter la touche retour du système. En mode plein écran, un appui revient au mode fenêtre. En mode fenêtre, la lecture s'arrête et la vue se ferme.
procedure TMediaForm.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Key = vkHardwareBack then
begin
case MediaViewer.CurrentMode of
TPlaybackMode.WindowMode:
begin
MediaViewer.PausePlayback;
Close;
end;
TPlaybackMode.FullscreenMode:
begin
MediaViewer.SwitchMode(TPlaybackMode.WindowMode);
end;
TPlaybackMode.FloatMode:
begin
MediaViewer.SwitchMode(TPlaybackMode.WindowMode);
end;
end;
Key := 0;
end;
end;
La méthode SwitchMode déclenche en interne l'événement OnRequestPlayMode défini précédemment.
Gestion de l'arrière-plan application
Lorsque l'application passe en arrière-plan (appel entrant, etc.), la lecture doit être suspendue. L'observateur d'activité native TCCFMXNativeActivityObserver fournit les événements nécessaires.
procedure TMediaForm.ActivityObserverPause(Sender: TObject);
begin
if MediaViewer.CurrentMode <> TPlaybackMode.FloatMode then
begin
MediaViewer.PausePlayback;
end;
end;
procedure TMediaForm.ActivityObserverResume(Sender: TObject);
begin
MediaViewer.ResumePlayback;
end;
Configuration de l'interface utilisateur
Un fond noir pour le lecteur est essnetiel pour une expérience immersive. De plus, il faut adapter l'interface aux barres système (barre d'état, barre de navigation). Le composant TCCSystemBar permet d'obtenir ces dimensions.
procedure TMediaForm.FormCreate(Sender: TObject);
begin
SystemBar.MakeStatusBarTranslucent;
StatusBarLayout.Height := SystemBar.StatusBarHeight;
NavBarLayout.Height := SystemBar.NavigationBarHeight;
end;
function TMediaForm.CalculateNavBarHeight: Single;
begin
if SystemBar.IsNavigationBarVisible then
Result := SystemBar.NavigationBarHeight
else
Result := 0;
end;
Pour les barres de navigation virtuelles dont la visibilité peut changer, un minuteur peut périodiquement mettre à jour la hauteur allouée.
procedure TMediaForm.NavBarTimerTimer(Sender: TObject);
begin
if Self.Visible then
NavBarLayout.Height := CalculateNavBarHeight;
end;
Le minuteur est activé lors de l'affichage de la vue et désactivé lors de sa masquade.
Mémorisation de la progression de lecture
Pour permettre la reprise d'une vidéo, il faut mémoriser la position. L'événement OnProgress fournit la progression courante en millisecondes.
procedure TMediaForm.MediaViewerProgress(Sender: TObject; progress, duration: Integer);
begin
CurrentProgress := progress;
end;
Lors du chargement d'une vidéo, l'événement OnPrepared est déclenché. C'est ici que l'on effectue un saut à la position mémorisée, si elle existe.
procedure TMediaForm.MediaViewerPrepared(Sender: TObject);
begin
if SavedProgress > 0 then
MediaViewer.SeekToPosition(SavedProgress div 1000);
end;
Lors du démarrage de la lecture, on vérifie si l'URL correspond à la vidéo précédemment lue pour restaurer la progression.
procedure TMediaForm.StartVideoPlayback(const videoUrl: string);
begin
if (PreviousUrl = videoUrl) and (CurrentProgress > 0) then
begin
SavedProgress := CurrentProgress;
MediaViewer.Play('Retour', videoUrl);
end
else
begin
PreviousUrl := videoUrl;
SavedProgress := 0;
MediaViewer.Play('Retour', videoUrl);
end;
end;
Cette implémentation mémorise la progression pour la lecture répétée d'une même vidéo. Pour une persistance multi-vidéos, un stockage local structuré serait nécessaire.