Android Stream MP3 & Implémentation Listener Java depuis Delphi

Contenu du snippet

Depuis peu, je me suis mis à programmer sur Android via Delphi XE 6 grace à
Firemonkey et je me suis confroté à un souci : Comment implémenter un "Litstener"
java via Delphi. Aprés plusieurs recherche j'en suis arrivé à solutionner ce
problème. Et le but de ce court billet est de vous faciliter vos futurs
programmations Android via Delphi et par la même occasion comment lire un mp3
depuis une url en streaming.

Dans cette exemple nous allons informer l'utilisateur du pourcentage de
téléchargement du morceau a écouter. A 100% l'utilisateur sera en mesure de se
déplacer librement sur la chanson grace à un Trackbar que vous ajouterai si le
coeur vous en dit.

Commencez par Créer une classe TMp3BufferingListener
-Notez que tout listener que vous implémanter doit hériter de la classe
TJavaLocal et implémenter l'interface du listener que vous souhaiter utiliser.

TMp3BufferingListener = class(TJavaLocal, JMediaPlayer_OnBufferingUpdateListener)
    private
        //Va stoquer notre formulaire pour lui transmettre le taux de téléchargement
        //et ainsi mettre à jour l'interface.
        FOwner : TExampleForm;
    public
        constructor Create(AOwner : TExampleForm);
        //Notez également la convention d'appel cdecl; ce n'est pas un choix
        //vos implémentation devront utiliser cette convention autrement
        //vous aurez des erreurs de compilation.
        procedure onBufferingUpdate(AMp: JMediaPlayer; APercent: Integer); cdecl;
end;

et dans votre TExampleForm :
TExampleForm = class(TForm)
    //[..]
    private
        // Déclaration de notre lecteur MP3 Android.
        FPlayer : JMediaPlayer;
        FBufferingListener : TMp3BufferingListener;
    public
        // Apprait dans la section publique sinon on y aura pas accés depuis
        // TMp3BufferingListener.
        procedure setLoaded(APercent:integer);
        // Procédure a appeler avec une url vers un mp3 à jouer pendant son
        // téléchargement.
        procedure playUrlMp3(AMp3Url:string);
end;

Pour les uses :
    uses 
    Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.Helpers,
    Androidapi.Jni.Media, Androidapi.Jni.NetWork, FMX.PlatForm.Android,
    Androidapi.Jni.GraphicsContentViewText;


et dans la partie implémentation :

{$Region 'Implémentation TMp3BufferingListener'}
constructor TMp3BufferingListener.Create(AOwner : TExampleForm);
begin
    FOwner := AOwner;
end;

procedure TMp3BufferingListener.onBufferingUpdate(AMp: JMediaPlayer; APercent: Integer);
begin
  FOwner.setLoaded(APercent);
end;
{$EndRegion}

{$Region 'Implémentation TExampleForm'}
constructor TExampleForm.FormCreate(Sender: TObject);
begin
    // Remarquez qu'ici on n'utilise pas 
    // Player := JMediaPlayer.Create ce à vous aurez normalement pensé
    // Ce sera pareille pour la plus part des autre composant Android
    // on déclare avec J_nom_du_composant et on instancie avec TJ_nom_du_composant
    FPlayer := TJMediaPlayer.Create;
    // Dés lors nous faisons comme si nous étions sur java
    // Nous informons le lecteur que ce sera un flux
    FPlayer.setAudioStreamType(TJAudioManager.JavaClass.STREAM_MUSIC);
    // Nous créons notre listener
    FBufferingListener := TMp3BufferingListener.Create(self);
    // Nous affectons notre Listener aprés sa création évidemment
    FPlayer.setOnBufferingUpdateListener(FBufferingListener);

end;

procedure TExampleForm.setLoaded(APercent:integer);
begin
    // On affiche notre pourcentage de téléchargement quelque part
    lblTaux.Text := 'Chargement à '+inttostr(APercent)+'%';
end;

// Vous n'aurez qu' à appeler cette procédure n'importe quand vous le voulez
// Ex : PlayUrlMp3('http://jj08.descamps.free.fr/MP3/hymnejoie.mp3');
// --Hymne à la joie de beethoven à la guitare par Jean Jacques Descamps
// --site : http://jj08.descamps.free.fr
procedure TExampleForm.PlayUrlMp3(AMp3Url:string);
begin
    // important pour remettre à zéro le lecteur sans quoi vous aurez droit
    // à une exception et le reste de la procédure ne sera pas exécuté
    FPlayer.reset;
    // Nous définissons notre url
    // StringToJString : convertit une chaine Delphi en chaine java
    FPlayer.setDataSource(StringToJString(AMp3Url));
    // Le lecteur se prépare
    FPlayer.prepare();
    // Et débute la lecture
    FPlayer.start();
end;
{$EndRegion}


Voilà, en espérant que cela vous sera utile.

Cordialement.

Compatibilité : 1

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.