2012-03-11 33 views
36

Tworzę aplikację, która będzie miała wiele obrazów na ekranie, obrazy te będą przyciskami, a po stuknięciu będą odtwarzać krótki dźwięk. Zbadałem to i mogłem znaleźć tylko obecną metodę, której używam do odtwarzania dźwięków, która w ogóle nie reaguje. Chcę, żeby dźwięk grał szybko i reagował na wiele szybkich kranów. Nie byłem pewien, czy było to możliwe w Androidzie.Prawidłowy sposób odtwarzania krótkich dźwięków Androida?

Kod używam grać mój dźwięk jest taka:

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(); 

      } 

    }); 



    } 

Moja lag problem może także być może w dół do drogi Używam obiekt odtwarzacza multimedialnego? Uważam, że powinno to być bardziej płynne w moim telefonie, wszelkie sugestie dotyczące tego, jak odtwarzać dźwięki w systemie Android, są doceniane.

Dzięki.

Od odkrycia dźwięku Pool, mam edytowane mój kod do korzystania z tego i działa idealnie, nowy kod wygląda następująco:

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); 

      } 

    }); 


    } 

Dzięki

+2

Wygląda na to, że nie używasz soundPoolMap? – Moberg

+1

Uwielbiam sposób w jaki zaimplementowałeś, zadziałał od razu – desgraci

+0

Dziękuję bardzo. Działa świetnie ...! –

Odpowiedz

25

Można używać SoundPool. Pasuje idealnie do tego, co chcesz robić.

Potrzebny jest tylko sposób przechowywania identyfikatorów efektów dźwiękowych odpowiadających każdemu obrazowi (lub przyciskowi).

Prawdopodobnie przedłużyć przycisk, aby zapisać powiązany identyfikator efektu dźwiękowego. Użyj zwykłej SoundPool, aby odtworzyć efekt dźwiękowy związany z identyfikatorem po dotknięciu przycisku.

You can read more about SoundPool here.

+1

Dziękuję za twoją radę i link. Popatrzyłem dalej i znalazłem tutorial, pomógł mi rób to, co chciałem, to na pewno jest znacznie lepsze niż odtwarzacz multimedialny! Wielkie dzięki! – deucalion0

+0

Czy mógłbyś zamieścić link do samouczka? – Moberg

+0

@Moberg tutaj masz jeden http://stackoverflow.com/questions/17069955/play- sound-using-soundpool-example –

3

@Rikonator jest tam na właściwej ścieżce z Soundpool. Jest bardziej dostosowany do rodzaju funkcjonalności, której szukasz.

Jeśli jednak zdecydujesz się na użycie mediaplayer, nie zapomnij o metodzie prepareAsync(), aby zapobiec zawieszeniu wątku interfejsu użytkownika. Możesz przeczytać więcej na temat odtwarzania mediów here.

+1

Może być lepiej zablokować wątek interfejsu użytkownika, ponieważ dźwięki są używane dla przycisków. Może być źle zawieszać interfejs użytkownika, ale dźwięk spóźniony jest trochę dziwniejszy. – Tonithy

2
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(); 
} 
Powiązane problemy