Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como desligo todos os sons do aplicativo quando onPause() ou onStop() ?

Olá.

Quando saio do aplicativo o som continua tocando. Como desligo todos os sons do aplicativo quando saio do aplicativo?

classe Som:

public class Som {
    private SoundPool soundPool;
    public static int somDoJOGO;

public Som(Context context) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            createNewSoundPool();
        } else {
            createOldSoundPool();
        }
        somDoJOGO = soundPool.load(context, R.raw.somdojogo, 1);
    }

private void createOldSoundPool() {
        soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public void createNewSoundPool() {
        AudioAttributes audioAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();

        soundPool = new SoundPool.Builder()
                .setAudioAttributes(audioAttributes)
                .setMaxStreams(AudioManager.STREAM_MUSIC)
                .build();
    }

public void tocaSom(int som) { 
        soundPool.play(som, 1, 1, 1, 0, 1);
    } 
}
4 respostas

Pode criar um método na classe Som chamado desliga:

public void desliga(int som) {
    soundPool.stop(som);
}

e chamá-lo no onPause da MainActivity:

public void onPause() {
    som.desliga(Som.somDoJOGO);
}
solução!

Deu certo com

soundPool.release();

Obrigado.

Cuidado com o método release. Após um release, aquele objeto que você deu load é destruído.

Você pode fazer esse código:

public void desliga(int som) {
    soundPool.stop(som);
}

public void destroi() {
    soundPool.release();
}

E chamá-los em momentos diferentes:

public void onPause() {
    som.desliga(Som.SOM_DO_JOGO);
}

public void onDestroy() {
    som.destroi();
}

Ficou melhor ainda com:

@Override
    protected void onResume() {
        super.onResume();
     //...

    gravador.autoResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    //...       

     gravador.autoPause();
    }

Obrigado.