Executando sons no Android! MediaPlayer, SoundPool e RingtoneManager.

Em alguns momentos em aplicações móveis é muito interessante o sistema responder com sons a determinados eventos realizados pelo usuário.

Para exemplificar, quando um download é bem sucedido é comum e esperado pelo usuário que um som amistoso de sucesso ocorra. Ou quando algum amigo te chama para conversar no talk e um som de alarme é acionado. Sem dúvida são recursos interessantes mas é importante usa-los com moderação. Aplicações com efeitos sonoros exagerados tendem a irritar os usuários.

Vejamos alguns componentes que a API do Android disponibiliza para execução de sons:

Nesse primeiro trecho utilizaremos a classe RingtoneManager.

Com essa estrutura iremos executar um som provido pela URI RingtoneManager.TYPE_NOTIFICATION).

De modo que quando esse código for executado o Android vai buscar o som que o usuário definiu para ser acionado quando ocorrer notificações. Tais como quando ele recebe mensagens SMS.

Podemos ver que a classe RingtoneManager possui outras constantes como TYPE_ ALARM e TYPE_RINGTON que também executam o mesmo procedimento. Elas identificam o som definido pelo usuário (para aquela determinada situação) e o recuperam  para serem acionados em sua aplicação. Isso é muito interessante pois é um modo de deixar o usuário mais a vontade com  o seu sistema. Uma vez que os sons que foram executados foram definidos por ele próprio.

Vejamos um pouco de prática:

private void playSound() {
 Uri notification =
 RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
 Ringtone ringtone =
 RingtoneManager.getRingtone(getApplicationContext(), notification);
 ringtone.play();
}

Existem mais duas classes para serem analisadas:

SoundPool e MediaPlayer

Essas classes são mais fáceis de serem encontradas em projetos Android. A primeira (SoundPool) é voltada para arquivos pequenos, que são executados com uma frequência alta.
Isso acontece porque essa estrutura mantém o arquivo que será executado na memória RAM do dispositivo. Daí a necessidade de ser um arquivo pequeno, manter um arquivo grande na memória do aparelho pode ocasionar OutOfMemory ( Falta de memória e crash da aplicação).
Imaginando um jogo de luta, o som de um soco seria um bom momento para utilizar essa estrutura, sabendo que se trata de um arquivo curto e que será executado muitas vezes dentro do jogo.

A classe MediaPlayer por sua vez é voltada para arquivos maiores. E que serão executados apenas uma vez, mas por um período mais longo.
Isso acontece porque essa estrutura mantém o arquivo que é executado no setor de armazenamento do dispositivo. Como se fosse o HD. De modo que a memória RAM não fica comprometida.
Imaginando mais uma vez um jogo de luta, essa classe seria ideal para executar o som que fica executando no fundo durante todo o jogo. Por ser um arquivo grande e por ser executado por um período maior.

O código abaixo demonstra como acionar um som através de um arquivo (geralmente no formato mp3). Este arquivo pode ser qualquer um que o desenvolvedor queira, basta que ele faça download do mesmo e o coloque na pasta raw da aplicação. Essa pasta não é criada automaticamente quando se cria um projeto Android, por tanto é necessário que você mesmo a crie.

Após criada, e com o arquivo la dentro, podemos alcançar o mesmo através da classe R.

Podemos ver um exemplo do seu uso no trecho de código abaixo:

private void playSound() {
   MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.beep);
   mediaPlayer.start();
}

Essa classe possui muito mais possibilidades, como parar, voltar, adiantar etc.
Veja como atingir essas funcionalidades através da documentação oficial.

Aqui também possui um artigo que exemplifica todas essas funções.

Agora chegou a vez do SoundPool

Como podemos ver no código abaixo a classe SoundPool precisa informar três parâmetros. No seu construtor, são eles:

maxStreams: The maximum number of simultaneous streams for this SoundPool object
( A quantidade de vezes que o arquivo pode ser executado simultâneamente).

streamType: The audio stream type as described in AudioManager For example, game applications will normally use STREAM_MUSIC.
( O tipo de Stream que será executado).

srcQuality: The sample-rate converter quality. Currently has no effect. Use 0 for the default.
( A qualidade da execução do arquivo).

Após construir este objeto. Podemos executar o som através do trecho de código abaixo:

protected void playSound(int soundID ) {
        SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100);
	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);	
}

Veja que utilizamos o método play passamos o id do arquivo que será executado, o volume, a prioridade,se ele vai ser executado em loop dentre outras.

Logo abaixo segue a explicação dos parâmetros segundo a documentação oficial:

Parameters

soundID a soundID returned by the load() function
leftVolume left volume value (range = 0.0 to 1.0)
rightVolume right volume value (range = 0.0 to 1.0)
priority stream priority (0 = lowest priority)
loop loop mode (0 = no loop, -1 = loop forever)
rate playback rate (1.0 = normal playback, range 0.5 to 2.0)

Returns
non-zero streamID if successful, zero if failed

Agora você já sabe das principais formas de execução de sons no Android. 😉

Anúncios

, , ,

  1. Deixe um comentário

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s