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.
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.