Pergunta

Oi eu sou novo nisso. Meu projeto de auto-ensino é um pequeno aplicativo que reproduz um fluxo de notícias de áudio. Para ser eficaz, o aplicativo realmente precisa interromper qualquer jogador de mídia atualmente (por exemplo: Último FM, IMEM, Music Player, Spotify etc.).

Não sei o que estará tocando ou qual aplicativo estará jogando, mas quero pedir que todos eles pausem até que eu tenha feito. Parece bastante ousado, eu sei, mas deve ser possível, porque quando há uma chamada de entrada, é basicamente o que acontece.

Posso enviar uma mensagem a todos os jogadores de áudio pedindo para que façam uma pausa por um momento? Eu poderia falsificar uma chamada recebida, apenas pelo tempo que leva?

Obrigado.

Foi útil?

Solução

O manuseio de áudio no Android será bastante horrível por um tempo. As APIs são muito estranhas, mal documentadas e continuam mudando/depreciando/quebrando entre versões. Mesmo o AudioManager O código tem fixmes nele.

De qualquer forma, existem vários tipos de fluxo no Android (música, notificações, telefonemas etc.) e aplicativos destinam -se a escolher o apropriado para reprodução. Eu imagino que a maioria dos aplicativos Android deve usar o tipo de música/mídia (STREAM_TYPE_MUSIC). Você define isso no seu MediaPlayer usando o setAudioStreamType método.

O SDK permite que você defina um único fluxo modelo Como solo - fazendo com que todos os outros fluxos sejam silenciados -, mas não acredito que você possa identificar o áudio que está sendo reproduzido por aplicativos específicos e de alguma forma pausar/desconhecer. Aplicativos musicais em geral usarão o PhoneStateListener Para fazer uma pausa quando uma ligação entra.

Então, no seu caso, você pode "emprestar" o fluxo de telefonema para o seu MediaPlayer e use a chamada do método AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true) Quando a reprodução começa, então desmole o fluxo com false quando reprodução ou seu Activity é feito.

Posso dizer -lhe que isso funciona, mas não me lembro de incentivo se você também precisa definir o áudio modo para MODE_IN_CALL Ao usar o fluxo de chamadas de voz (como este: AudioManager.setMode(AudioManager.MODE_IN_CALL)). Se você achar necessário, precisará devolver o modo para MODE_NORMAL Uma vez que a reprodução seja concluída, caso contrário, sempre que você pressionar as teclas duras do volume, ele dirá "volume na planta"! No entanto, se e quando você quiser voltar para MODE_NORMAL, você deve verificar se um telefonema genuíno não está acontecendo naquele momento ...

Talvez você possa usar outro tipo de fluxo em vez da chamada de voz, mas estou falando por experiência própria trabalhando em um aplicativo que poderia usar o viva -voz ou o fone de ouvido para reprodução de áudio, que requer o uso do fluxo de chamadas de voz.

Como eu disse, o manuseio de áudio não é particularmente divertido ...;)

Outras dicas

Já se passaram 2 anos. Mas espero que isso possa ajudar alguém:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);

Observação: Se você ligar setStreammute (int, booleano) Para silenciar o fluxo n vezes, você deve chamá -lo n vezes novamente para ativar o som (use false).

Podes tentar Audiomanager.adjustVolume método:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top