Можно ли воспроизводить класс SoundPool в onCreateView()?

Я работаю над приложением, в котором при запуске нового фрагмента должно начаться воспроизведение звука. Поэтому я использую Soundpool для воспроизведения звука в onCreateView, но не работает. в чем может быть проблема? Soundpool не работает в OnCreateView?

это мой код

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.next_ex, container, false);

    createSoundPool();
    loadSounds();
    volumeSounds();

    mSoundPool.play(sdID_clock,volume/2,volume/2,0,0,1);

    return rootView;
}

protected void createSoundPool(){

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        mAttributesBuilder = new AudioAttributes.Builder();
        mAttributesBuilder.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION);
        mAttributesBuilder.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION);
        mAttributes = mAttributesBuilder.build();

        mSoundPoolBuilder = new SoundPool.Builder();
        mSoundPoolBuilder.setAudioAttributes(mAttributes);
        mSoundPool = mSoundPoolBuilder.build();
    } else {
        mSoundPool = new SoundPool(10, AudioManager.MODE_IN_COMMUNICATION,0);
        mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                                       int status) {
                loaded = true;
            }
        });
    }

}

protected void loadSounds(){
    sdID_clock = mSoundPool.load(getContext(), R.raw.clock,1);
}

protected void volumeSounds(){
    getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);
    audioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
    curVolume = (float)audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    maxVolume = (float)audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

    volume = curVolume / maxVolume;
}

1 ответ

Да, ты можешь. Вызовите эти методы из асинхронного потока.

createSoundPool();
loadSounds();
volumeSounds();

Затем переопределите setOnLoadCompleteListener, чтобы убедиться, что звуковые пулы загружаются перед их воспроизведением.

Другие вопросы по тегам