J'ai un petit mp3 (200kb) dans le dossier res/raw de mon 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 me préparer/commencer, 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); Essayez { MPlayer.prepare (); mPlayer.start (); } catch (IOException e) { // gérer cela plus tard }
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();
}
Lorsque vous arrêtez l'activité, c'est-à-dire sur onDestroy, mettez le code suivant.
public void onDestroy() {
mPlayer.stop();
super.onDestroy();
}
J'espère que cela aide :)
Vous préférerez probablement utiliser la classe SoundPool . Il réduit la latence quand il est temps de jouer le son et offre d'autres subtilités comme la possibilité de prioriser les sons quand il y en a trop pour jouer en même temps.
De la documentation:
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 en un flux PCM mono ou stéréo brut 16 bits. Cela permet aux applications d'être livrées avec des flux compressés sans avoir à subir la charge CPU et la latence de la 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 trouve un Enum (SoundType) et je place les fichiers mp3 dans le dossier brut sous le dossier res.