Comment puis-je lire un mp3 dans le dossier res/raw de mon application android?
J'ai un petit mp3 (200kb) dans le dossier res/raw de mon application android. J'essaie de l'exécuter dans un émulateur D'Eclipse. Il est reconnu comme une ressource dans le fichier R mais quand j'essaie de préparer / démarrer, mon activité se bloque! Y avait - il autre chose que je devais changer, peut-être dans le manifeste?
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile); try { mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { // handle this later }
3 réponses
Lors du démarrage de l'activité, c'est-à-dire sur onCreate, mettez le code suivant.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
mPlayer.start();
}
Lors de l'arrêt de l'activité, c'est-à-dire sur onDestroy, mettez le code suivant.
public void onDestroy() {
mPlayer.stop();
super.onDestroy();
}
J'espère que ça aide:)
Vous préférerez probablement utiliser la classeSoundPool . Il réduit la latence quand il est temps de jouer le son, et offre d'autres subtilités comme être capable de prioriser les sons quand il y en a trop pour jouer à la fois.
À partir des documents:
Un SoundPool est une collection d'échantillons qui peuvent être chargés en mémoire à partir d'une ressource à l'intérieur de L'APK ou à partir d'un fichier dans le système de fichiers. La bibliothèque SoundPool utilise le service MediaPlayer pour décoder l'audio dans un PCM 16 bits brut mono ou stéréo flux. Cela permet aux applications d'expédier avec des flux compressés sans avoir à subir la charge du processeur et la latence de décompression pendant la lecture.
Par exemple:
/**
* How many sounds can be played at once.
*/
private static final int MAX_SOUND_POOL_STREAMS = 4;
/**
* Modify this as part of your own priority scheme. Higher numbers mean higher
* priority. If you don't care, it's okay to use the same priority for every
* sound.
*/
private static final int NORMAL_PRIORITY = 10;
private int mySoundId;
@Override
public void setupContent() {
this.soundPool = new SoundPool(MAX_SOUND_POOL_STREAMS,
AudioManager.STREAM_MUSIC, 100);
this.mySoundId = this.soundPool.load(this.getApplicationContext(),
R.raw.mySound, 1);
}
@Override
private void playMySound() {
this.soundPool.play(this.mySoundId, 1, 1, NORMAL_PRIORITY, 0, 1);
}
C'est une méthode statique que j'utilise dans mes projets. Je l'ajoute à ma classe Utils:
public static void playSound(final Context context, final SoundType type)
{
new Thread(new Runnable()
{
@Override
public void run()
{
MediaPlayer mediaPlayer = new MediaPlayer();
int resId = -1;
switch (type)
{
case INCOMING_NOTIFICATION:
resId=R.raw.noti_sound;
break;
case SEND_BETTING_SLIP:
resId=R.raw.slip_sent;
break;
case TRIVIA_RIGHT_ANSWER:
resId=R.raw.game_bonus;
break;
case TRIVIA_WRONG_ANSWER:
resId=R.raw.whistle_referee_trivia_bad_answer;
break;
}
if (resId != -1)
{
mediaPlayer = MediaPlayer.create(context, resId);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(false);
mediaPlayer.start();
while (mediaPlayer.isPlaying() == true)
{
}
}
}
}).start();
}
}
Maintenant, je défine un Enum (SoundType) et placé les fichiers mp3 dans le dossier raw sous dossier res.