Android: почему я не могу воспроизвести звук при нажатии кнопки после нескольких нажатий? - PullRequest
2 голосов
/ 27 марта 2012

Я сделал, как если бы пользователь нажал на кнопку, то звук воспроизводится.Но сейчас я не могу слышать звук после нескольких щелчков.Я не знаю почему?

Вот код, который я использую для воспроизведения звука.

Код:

case R.id.lockView:
        playSound(R.raw.dooropen);
        break;
    }

public void playSound(int resources){
    boolean mStartPlaying = true;
    if (mStartPlaying==true){
        mPlayer = new MediaPlayer();
        Uri uri = Uri.parse("android.resource://com.project.iMystick/" + resources);
        try{
            mPlayer.setDataSource(getApplicationContext(),uri);
            mPlayer.prepare();
            mPlayer.start();
        } 
        catch (IOException e){
            Log.e(LOG_TAG, "prepare() failed");
        }
    } 
    else{
       //   stopPlaying();
        //rePlay.setText("Replay");
        mPlayer.release();
        mPlayer = null;
    }
    mStartPlaying = !mStartPlaying;
}

И после нескольких щелчков мыши я получил этот типсообщение об ошибке в logcat:

Log:

03-27 16:15:02.737: ERROR/MediaPlayer(1057): Error (-19,0)
03-27 16:15:03.858: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12
03-27 16:15:03.858: ERROR/AudioFlinger(34): not enough memory for AudioTrack size=32832
03-27 16:15:03.858: DEBUG/MemoryDealer(34):   AudioTrack (0x12abf8, size=1048576)
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     0: 0012ac10 | 0x00000000 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     1: 0012aca0 | 0x00008040 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     2: 0012b5a8 | 0x00010080 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     3: 0012bec8 | 0x000180C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     4: 0012c7f0 | 0x00020100 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     5: 0012d1f0 | 0x00028140 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     6: 0012db20 | 0x00030180 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     7: 00136448 | 0x000381C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     8: 0013ee00 | 0x00040200 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):     9: 0000de10 | 0x00048240 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    10: 0012b708 | 0x00050280 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    11: 00022c70 | 0x000582C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    12: 000234c0 | 0x00060300 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    13: 00115e38 | 0x00068340 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    14: 00117a80 | 0x00070380 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    15: 00118798 | 0x000783C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    16: 00042228 | 0x00080400 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    17: 0004bd48 | 0x00088440 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    18: 00055998 | 0x00090480 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    19: 0005f5f0 | 0x000984C0 | 0x00003040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):    20: 000712b0 | 0x0009B500 | 0x00008040 | A
03-27 16:15:03.867: ERROR/AudioTrack(34): AudioFlinger could not create track, status: -12
03-27 16:15:03.867: ERROR/AudioSink(34): Unable to create audio track
03-27 16:15:03.877: ERROR/MediaPlayer(1057): error (-19, 0)

enter code here

Ответы [ 4 ]

6 голосов
/ 27 марта 2012

Вам необходимо освободить () медиаплееры, иначе ресурсы не будут освобождены, и вы скоро выйдете из памяти (так как вы распределите их снова в следующий раз).поэтому я думаю, что вы можете играть дважды или даже трижды ... но не много раз, не освобождая ресурсы

Рекомендуется, чтобы после того, как объект MediaPlayer больше не использовался, немедленно вызывайте release (), чтобы ресурсыиспользуемый внутренним механизмом проигрывателя, связанным с объектом MediaPlayer, может быть немедленно освобожден.Ресурс может включать в себя одноэлементные ресурсы, такие как компоненты аппаратного ускорения, а сбой вызова release () может привести к тому, что последующие экземпляры объектов MediaPlayer откатятся к программным реализациям или вообще потерпят неудачу. См. Эту ссылку

2 голосов
/ 27 марта 2012

MediaPlayer не предназначен для работы так, как вы пытаетесь его использовать. Вот почему вы столкнулись с проблемой.

MediaPlayer - это `не очень хорошая опция , когда вы играете небольшие звуковые эффекты, так как пользователь может очень быстро нажать на несколько кнопок, и вам придется создать объект MP для всех них, который не происходят синхронно и сразу после нажатия кнопок. Выберите класс SoundPool , который позволяет сохранять в памяти загруженные звуки меньшего размера и воспроизводить их в любое время без задержки, которую вы испытываете в медиаплеере. http://developer.android.com/reference/android/media/SoundPool.html Вот хороший учебник: http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

1 голос
/ 23 апреля 2017

У меня была такая же проблема, и я решил ее с помощью метода release () в OnCompletionListener:

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource);
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });
1 голос
/ 27 марта 2012

Я думаю, проблема в том, что вы не подождали, пока первый закончит (или остановит) запуск второго. попытайтесь прослушать предыдущий, когда он завершится, затем запустите следующий .. вы можете использовать setOnCompletionListener.

похожая проблема: Android играет две песни проблема

код:

    package ooo.iii;

    import java.io.IOException;


    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class Test_audioActivity extends Activity { 
        /** Called when the activity is first created. */
        Button btn;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.main); 
            setContentView(R.layout.main);
            btn=(Button)findViewById(R.id.ss);

            btn.setOnClickListener(new OnClickListener() { 

                @Override
                public void onClick(View v) {
                    playSound(R.raw.musi);

                }
            });

        }



    public void playSound(int resources){
        try{
        boolean mStartPlaying = true;
        MediaPlayer  mPlayer=null;
    if (mStartPlaying==true){

          mPlayer = new MediaPlayer();
        Uri uri = Uri.parse("android.resource://ooo.iii/" + resources);

            mPlayer.setDataSource(getApplicationContext(),uri);
            mPlayer.prepare();
            mPlayer.start();

    } 
    else{
       //   stopPlaying();
        //rePlay.setText("Replay");
        mPlayer.release();
        mPlayer = null;
    }
    mStartPlaying = !mStartPlaying;


    } 
    catch (IOException e){
        Log.e("ERR", "prepare() failed");
    }
    }



}

Вам необходимо изменить:

1 - источник @ res / raw / musi .. к вашему

2 - идентификатор кнопки в файле res / layout / main.xml от ss до вашей ..

3- Uri uri = Uri.parse ("android.resource: //ooo.iii/" + resources); исправить имя пакета к вашему

вот и все .. Я тестировал на реальном устройстве, много раз нажимал и получал новый звук выше предыдущего, который все еще воспроизводится

...