Multimedia Sound and Video Context Android (Wajiha al Ayoubi)

Introduction

Le système Androïde permet de supporter divers types de fichiers médias. On peut ainsi intégrer des images , des fichiers audio et vidéo dans nos applications. Les fichiers multimédia peuvent avoir de différentes sources :

  1. Ressources locales
  2. URIs internes
  3. URL externes

Les applications d’androïde contenant des fichiers multimédia interagissent alors avec les utilisateurs et le système afin d'obtenir la performance attendue.

Utilisation de la classe MediaPlayer

La classe MediaPlayer est la classe la plus utilisée dans la programmation de nos applications. un objet de cette classe peut chercher , décoder et lire un fichier multimédia quelque soit sa source.

Les étapes à suivre

  • Création d'un objet de la classe MediaPlayer.
    • utilisation de l'instance de la classe MediaPlayer pour faire appel des méthodes suivantes :
      • SetdataSource(); // les arguments de cette méthode dépendent de la source dont provient le fichier multimédia.
      • prepare(); // une méthode synchrone qui prépare le lecteur pour lire le fichier multimédia.
      • start(); // pour commencer la lecture du fichier multimédia.
  • Ou Bien, utiliser une autre méthode de la classe MediaPlayer:
    • create(); // retourne un objet de la classe MediaPlayer et fait le travail des méthodes SetDataSource() et prepare()
    • start();

Le Diagramme des états

Ce diagramme montre le cycle de vie et les états d'un objet de la classe MediaPlayer :

Ressources Locales des Fichiers Médias


Lire les fichiers multimédia disponibles comme « Raw Ressource » enregistrés dans notre application. (res/raw/directory)

    void SetDataSource( FileDescriptor  fd)

Ou

   static MediaPlayer create (Context context, int resid) // context est le contexte utilisé et
                                        // resid est l'id du raw ressource (R.raw.something)

L'exemple suivant montre comment on peut lire un fichier audio sauvegardé dans un "folder" appelé raw dans l'application :

01.public class MainActivity extends Activity implements OnCheckedChangeListener {
02.MediaPlayer Audio_1;
03.Context context = null;
04.@Override
05.protected void onCreate(Bundle savedInstanceState) {
06.super.onCreate(savedInstanceState);
07.setContentView(R.layout.activity_main);
08.Button play = (Button) findViewById(R.id.play);
09.Button stop = (Button) findViewById(R.id.stop);
10. 
11.play.setOnClickListener (new View.OnClickListener() {
12.@Override
13.public void onClick(View v) {          
14.try {
15.Audio_1 = MediaPlayer.create(MainActivity.this, R.raw.song);
16.Audio_1.setAudioStreamType(AudioManager.STREAM_MUSIC);
17.Audio_1.prepare();
18.catch (IllegalStateException e) {                
19.e.printStackTrace();
20.catch (IOException e) {                  
21.e.printStackTrace();
22.}
23.Audio_1.start();
24.
25.});   
26.stop.setOnClickListener (new View.OnClickListener() {
27.@Override
28.public void onClick(View v) {          
29.Audio_1.release();
30.Audio_1 = null;
31.}
32.});     
33.}
34.@Override
35.public boolean onCreateOptionsMenu(Menu menu) {
36.// Inflate the menu; this adds items to the action bar if it is present.
37.getMenuInflater().inflate(R.menu.main, menu);
38.return true;
39.}
40.@Override
41.public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
42.// TODO Auto-generated method stub
43.}
44.}

URIs Internes

Lire les fichiers multimédia disponibles localement dans le système ( enregistrés sur votre « device » mais dans d’autres applications) en utilisant les URIs

   void SetDataSource (Context context, Uri myuri)

Ou

   static MediaPlayer create (Context context, Uri myuri)

Ou tout simplement utiliser la classe Intent comme le montre l'exemple suivant :

01.public class MainActivity extends Activity implements OnCheckedChangeListener {
02.@Override
03.protected void onCreate(Bundle savedInstanceState) {
04.super.onCreate(savedInstanceState);
05.setContentView(R.layout.activity_main);
06.Button play = (Button) findViewById(R.id.play);
07.Button stop = (Button) findViewById(R.id.stop);
08.play.setOnClickListener (new View.OnClickListener() {
09.@Override
10.public void onClick(View v) {  
11.Intent serv = new Intent();
12.serv.setAction(android.content.Intent.ACTION_VIEW); 
13.File file = new File("/storage/sdcard0/media/audio/song2.mp3"); 
14.serv.setDataAndType(Uri.fromFile(file), "audio/*"); 
15.startActivity(serv);
16.}
17.});    
18.stop.setOnClickListener (new View.OnClickListener() {
19.@Override
20.public void onClick(View v) {          
21.finish(); 
22.}
23.});          
24.}
25.@Override
26.public boolean onCreateOptionsMenu(Menu menu) {
27.// Inflate the menu; this adds items to the action bar if it is present.
28.getMenuInflater().inflate(R.menu.main, menu);
29.return true;
30.}
31.@Override
32.public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
33.// TODO Auto-generated method stub 
34.}
35.}

URL Externes

Lire les fichiers multimédia en ligne disponibles sur une connexion réseau (internet)

      void SetDataSource (Context context, String myurl)

par exemple :

01.public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener {
02.MediaPlayer Audio_3;
03.@Override
04.protected void onCreate(Bundle savedInstanceState) {
05.super.onCreate(savedInstanceState);
06.setContentView(R.layout.activity_main);    
07.Button stop = (Button) findViewById(R.id.stop);    
09.Audio_3 = new MediaPlayer();
10.Audio_3.setAudioStreamType(AudioManager.STREAM_MUSIC);
11.try {
12.Audio_3.setDataSource(url);        
13.catch (IllegalArgumentException e) {
14.e.printStackTrace();
15.catch (SecurityException e) {
16.e.printStackTrace();
17.catch (IllegalStateException e) {
18.e.printStackTrace();
19.catch (IOException e) {
20.e.printStackTrace();
21.}      
22.Audio_3.setOnPreparedListener( this);
23.Audio_3.prepareAsync();        
24.Audio_3.setOnErrorListener(this) ;         
25.stop.setOnClickListener (new View.OnClickListener() {
26.@Override
27.public void onClick(View v) {                          
28.Audio_3.release();
29.Audio_3 = null;                    
30.}                  
31.});                 
32.}
33.@Override
34.public boolean onCreateOptionsMenu(Menu menu) {
35.// Inflate the menu; this adds items to the action bar if it is present.
36.getMenuInflater().inflate(R.menu.main, menu);
37.return true;
38.}
39.@Override
40.public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
41.return false;
42.}
43.@Override
44.public void onPrepared(MediaPlayer mp) {
45.mp.start();
46.}            
47.}

Les formats des Fichiers Médias supportés par Androïde

Les formats des fichiers multimédia doivent être parmi la liste des formats média supportés par Androïde :

Avantage de l'utilisation de préparation asynchrone

 public void prepare (); // prépare d'une façon synchrone le lecteur pour lire le fichier
                     multimédia, son exécution va prendre un plus de temps, 
                     et l’interface utilisateur reste accrocher jusqu’à ce que la méthode retourne
                     son résultat. Ainsi elle déclencher Application Not Responding (error) 

La solution est offerte par :

 public void prepareAsync ();//commence la préparation du fichier multimédia et retourne
                               immédiatement.

Puis quand le fichier multimédia sera prêt la méthode

  void  setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);

va appler la methode suivante :

  public void onPrepared(MediaPlayer mp) {
                    mp.start()   }			  

Traitement des erreurs asynchrones


Dans les opérations synchrones les erreurs sont signalées par le code d'erreur. Alors qu'avec les méthodes asynchrones il faut s'assurer que notre application soit convenablement signalée des erreurs. En MediaPlayer on implémente l'interface  MediaPlayer.OnErrorListener. Puis on utilise la méthode :

   void setOnErrorListener(MediaPlayer.OnErrorListener listener);

Qui fait appel à :

  public abstract boolean onError (MediaPlayer mp, int what, int extra); //avec  what  type de
                        l’erreur et extra est un extra code spécifique à l’erreur	

Libération de la MediaPlayer

Pour libérer les ressources accrochées à une instance de MediaPlayer on utilise les deux méthodes de la classe MediaPlayer :

       public void release ();
       mymedia = null;

Pour s’assurer de la libération de la MediaPlayer on ne peut pas compter seulement sur le travail du " garbage collector " il est conseillé d'utiliser la methode suivante ( surtout quand on utilise un Service)

                public void onDestroy() {. if (mymedia != null) mymedia.release();. }

References

Comments