2016-03-04 2 views
1

Пока я сканирую стойки с помощью штрих-кода, я реализовал одноэлементный класс звукового пула, продолжая сканирование, автоматически закрывая приложение. Ошибка: «Не удалось прочитать дескрипторы файла входного канала из посылки».Как освободить Soundpool в android

public void successfulAlert() { 
    Logger.d("", "SuccessAlert Start" + Calendar.getInstance().getTimeInMillis()); 
    final int audioID = mSPool.load(Application.getInstance(), R.raw.scan, 1); 
    mSPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 

     @Override 
     public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
      Logger.d("", "SuccessAlert Completed " + Calendar.getInstance().getTimeInMillis()); 
      float volume = (float) mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
      mSPool.play(audioID, volume, volume, 1, 0, 1f); 
      /// cleanupSound(); 
     } 
    }); 
    Logger.d(TAG, "Possitive Scan Beep "); 
} 

Этот код для предупреждения об успешном завершении работы, я пытаюсь очистить релиз soundpool, звук не слышен. Может ли кто-нибудь предложить мне, как выпустить soundpool после воспроизведения звука.

public void cleanupSound() { 
    if (mSPool != null) { 
     mSPool.release(); 
     // mSPool=null; 
     // mAudioManager.unloadSoundEffects(); 
     // mInstance=null; 
    } 
} 

ответ

1

Вопрос в два раза: 1) Почему мой звук не играет? 2) Как правильно выпустить SoundPool?

Для 1 - игра SoundPool является асинхронной. Вы делаете: «играть, а затем выпускать», но вам нужно выполнить «играть, а затем ждать до тех пор, пока не будет воспроизведено, а затем будет выпущено».

Для 2 - из-за 1 вы не должны отпускать SoundPool до тех пор, пока воспроизведение не завершится. К сожалению, есть никоим образом, чтобы попросить SoundPool выполнить обратный вызов, когда он закончил игру. Я видел два решения этой:

  • Если вы знаете, как долго он будет принимать, чтобы играть образец (X мс), запланировать release, на Х мс в будущем, возможно, с использованием postDelayed из Handler.
  • Решите, что действительно важно, что SoundPool будет выпущен, когда ваше приложение будет завершено. Итак, контролируйте все точки выхода из своего приложения и убедитесь, что на каждом из них выпущена SoundPool. Если кто-то закрывает приложение во время воспроизведения звука, вы можете резко сократить этот эффект, но это, вероятно, правильное поведение, так как ваше приложение выходит!

Примечание. Чтобы быть действительно здоровым гражданином Android, ваше приложение должно воспроизводить звук только в том случае, если оно впервые приобрело и продолжает удерживать аудиофокус. Подробнее об этом здесь: https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html

Смежные вопросы