27 votes

La manière correcte de jouer des sons courts sur Android ?

Je suis en train de créer une application qui affichera plusieurs images à l'écran. Ces images seront des boutons qui, lorsqu'on les touchera, produiront un son bref. J'ai fait des recherches à ce sujet et je n'ai trouvé que la méthode actuelle que j'utilise pour jouer des sons, qui ne semble pas du tout réactive. Je veux que le son soit joué rapidement et qu'il réponde à de nombreuses pressions rapides. Je n'étais pas sûr que cela soit possible sous Android.

Le code que j'utilise pour jouer mon son est le suivant :

    Button sound1;
MediaPlayer  firstSound;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click);

    sound1 = (Button) findViewById(R.id.Sound1);

    beaver.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            firstSound.start();

            }

    });

    }

Mon problème de lag pourrait aussi être dû à la façon dont j'utilise l'objet media player ? J'ai l'impression que cela devrait être plus fluide sur mon téléphone. Toute suggestion sur la façon de lire des sons sous Android sera appréciée.

Merci.

Depuis que j'ai découvert Sound Pool, j'ai modifié mon code pour l'utiliser et cela fonctionne parfaitement, le nouveau code ressemble à ceci :

SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;
int soundID = 1;

Button sound1;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
    soundPoolMap = new HashMap<Integer, Integer>();
    soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1));

    sound1 = (Button) findViewById(R.id.bBeaver);

    sound1.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
              float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
              float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
              float leftVolume = curVolume/maxVolume;
              float rightVolume = curVolume/maxVolume;
              int priority = 1;
              int no_loop = 0;
              float normal_playback_rate = 1f;
              soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);

            }

    });

    }

Merci

16voto

Rikonator Points 900

Vous pouvez utiliser SoundPool . Il correspond parfaitement à ce que vous voulez faire.

Vous aurez juste besoin d'un moyen de stocker les ID des effets sonores correspondant à chaque image (ou bouton).

Peut-être étendre le bouton pour stocker l'ID de l'effet sonore associé. Et utiliser un SoundPool commun pour jouer l'effet sonore associé à l'ID lorsque le bouton est touché.

Vous pouvez en savoir plus sur SoundPool ici .

3voto

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);

try {
    if (mp.isPlaying()) {
        mp.stop();
        mp.release();

        mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    }

    mp.start();
} catch (Exception e) {
    e.printStackTrace();
}

2voto

Qw4z1 Points 1289

@Rikonator est sur la bonne voie avec Soundpool. Il est beaucoup plus adapté au type de fonctionnalité que vous recherchez.

Si vous décidez quand même d'utiliser le mediaplayer, n'oubliez pas la méthode prepareAsync () pour éviter de suspendre le thread de l'interface utilisateur. Vous pouvez en savoir plus sur la lecture des médias ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X