Tenho procurado em todos os lugares como reproduzir um som de toque / alarme no Android.
Eu pressiono um botão e quero reproduzir um toque / som de alarme. Não consegui encontrar uma amostra fácil e direta. Sim, já olhei o código-fonte do despertador ... mas não é simples e não consigo compilá-lo.
Eu não posso fazer isso funcionar:
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, alert);
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.setLooping(true);
player.prepare();
player.start();
}
Eu recebo este erro:
04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for
content://settings/system/ringtone
Então ... por favor, se alguém souber como tocar um toque / alarme padrão, me avise.
Prefiro não fazer upload de nenhum arquivo. Basta tocar um toque padrão.
android
android-emulator
Federico
fonte
fonte
Se um usuário nunca definiu um alarme em seu telefone, o TYPE_ALARM pode retornar nulo. Você pode explicar isso com:
fonte
null
, embora não aponte para um som válido. Você deve testar o valor de retorno deRingtoneManager.getRingtone()
para emnull
vez de / tambémEsta é a maneira que fiz:
É semelhante ao método do markov00, mas usa o MediaPlayer em vez do Ringtone, o que evita a interrupção de outros sons, como música, que já podem estar tocando no fundo.
fonte
Seu exemplo é basicamente o que estou usando. Ele nunca funciona no emulador, entretanto, porque o emulador não tem nenhum toque de chamada por padrão e
content://settings/system/ringtone
não se transforma em nada que possa ser reproduzido. Funciona bem no meu telefone real.fonte
Isso funciona bem:
fonte
Para os futuros googlers: use em
RingtoneManager.getActualDefaultRingtoneUri()
vez deRingtoneManager.getDefaultUri()
. De acordo com seu nome, ele retornaria o uri real, para que você possa usá-lo livremente. Da documentação degetActualDefaultRingtoneUri()
:Enquanto isso,
getDefaultUri()
diz o seguinte:fonte
Você pode enviar um arquivo MP3 para a pasta / sdcard usando DDMS, reiniciar o emulador, abrir o aplicativo de mídia, navegar até o arquivo MP3, pressioná-lo e selecionar "Usar como toque do telefone".
O erro desapareceu!
Editar: mesmo problema com sons de notificação (por exemplo, para SMS) resolvido usando o aplicativo Ringdroid
fonte
fonte
AlarmService
vem?Copiar um arquivo de áudio para o cartão SD do emulador e selecioná-lo por meio do reprodutor de mídia como o toque padrão realmente resolve o problema.
fonte
Você pode usar este código de amostra:
fonte
Pode ser tarde, mas há uma nova solução simples para essa questão para quem quiser.
Em kotlin
O código acima irá tocar o toque padrão, mas se você quiser o alarme padrão, mude
para
fonte
Aqui está um exemplo de código:
fonte
mediaPlayer
vez demp
.