Lire un fichier audio à partir du répertoire des ressources

J’ai le code suivant:

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); player = new MediaPlayer(); player.setDataSource(afd.getFileDescriptor()); player.prepare(); player.start(); 

Le problème est que, lorsque je lance ce code, il commence à lire tous les fichiers audio du répertoire des ressources, dans l’ordre alphabétique, au lieu de simplement lire le fichier audio demandé. Qu’est-ce que je fais mal? Existe-t-il un meilleur moyen de lire des fichiers audio à partir du répertoire des ressources?

Question complémentaire: Existe-t-il une différence entre conserver des fichiers audio dans le répertoire assets et les conserver dans le répertoire res / raw? Outre le fait qu’ils ne reçoivent pas d’identifiants s’ils se trouvent dans le répertoire des ressources. Si je déplace les fichiers audio dans le dossier res / raw, j’ai un problème avec la réutilisation de MediaPlayer car il n’y a pas de paramètre id pour setDataSource() . Je ne trouve pas de guide pour gérer ce type de problème.

 player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

Votre version fonctionnerait si vous n’aviez qu’un seul fichier dans le répertoire assets. Le contenu du répertoire des ressources ne sont pas réellement des “fichiers réels” sur le disque. Tous sont assemblés les uns après les autres. Donc, si vous ne spécifiez pas par où commencer et combien d’octets il faut lire, le lecteur lira jusqu’à la fin (c’est-à-dire continuera à lire tous les fichiers dans le répertoire assets)

Cette fonction fonctionnera correctement 🙂

 // MediaPlayer m; /*assume, somewhere in the global scope...*/ public void playBeep() { try { if (m.isPlaying()) { m.stop(); m.release(); m = new MediaPlayer(); } AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3"); m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); descriptor.close(); m.prepare(); m.setVolume(1f, 1f); m.setLooping(true); m.start(); } catch (Exception e) { e.printStackTrace(); } } 

Correction de la fonction ci-dessus pour la lecture et la pause

  public void playBeep ( Ssortingng word ) { try { if ( ( m == null ) ) { m = new MediaPlayer (); } else if( m != null&&lastPlayed.equalsIgnoreCase (word)){ m.stop(); m.release (); m=null; lastPlayed=""; return; }else if(m != null){ m.release (); m = new MediaPlayer (); } lastPlayed=word; AssetFileDescriptor descriptor = context.getAssets ().openFd ( "rings/" + word + ".mp3" ); long start = descriptor.getStartOffset (); long end = descriptor.getLength (); // get title // songTitle=songsList.get(songIndex).get("songTitle"); // set the data source try { m.setDataSource ( descriptor.getFileDescriptor (), start, end ); } catch ( Exception e ) { Log.e ( "MUSIC SERVICE", "Error setting data source", e ); } m.prepare (); m.setVolume ( 1f, 1f ); // m.setLooping(true); m.start (); } catch ( Exception e ) { e.printStackTrace (); } }