Android - je peux couper le son en cours de lecture des applications audio?
-
22-09-2019 - |
Question
Salut je suis nouveau à ce sujet. Mon projet d'auto-enseignement est une petite application qui joue un flux de nouvelles audio. Pour être efficace, l'application a vraiment besoin d'interrompre les lecteurs multimédia en cours de lecture (par exemple: Last FM, Imeem, lecteur de musique, Spotify, etc.).
Je ne sais pas ce qui va jouer ou quelle application va jouer, mais je veux leur demander tout de faire une pause jusqu'à ce que je l'ai fait. Sons plutôt gras, je sais, mais il doit être possible, parce que quand il y a un appel entrant, qui est essentiellement ce qui se passe.
Puis-je envoyer un message à tous les lecteurs audio pour leur demander de faire une pause pour un moment? Pourrais-je usurper un appel entrant, juste pour le temps qu'il faut?
Merci.
La solution
Audio sur Android traitement va être assez horrible pendant un certain temps. Les API sont assez bizarres, mal documentés, et ne cessent de changer / dévalorisant / rupture entre les versions. Même le code AudioManager
a FIXMEs en elle.
Quoi qu'il en soit, il existe plusieurs types de flux dans Android (musique, les notifications, les appels téléphoniques, etc.) et les applications sont destinées à choisir celui qui convient pour la lecture. J'imagine que la majorité des applications Android devrait utiliser le type de musique / média (STREAM_TYPE_MUSIC
). Vous définissez cela sur votre MediaPlayer
en utilisant la méthode setAudioStreamType
.
Le SDK ne vous permet de définir un seul flux type en solo - causant tous les autres cours d'eau pour être mis en sourdine - mais je ne crois pas que vous pouvez identifier l'audio en cours de lecture par des applications particulières et en quelque sorte une pause / réactivez il. applications de musique en général utiliseront le PhoneStateListener
pour se mettre en pause lorsque vous recevez un appel.
Dans votre cas, vous pouvez « emprunter » le flux d'appel téléphonique pour votre MediaPlayer
et utiliser l'appel de méthode AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)
lorsque la lecture commence, puis de solo le flux avec false
lorsque la lecture ou votre Activity
est fait.
Je peux vous dire que cela fonctionne, mais je ne me souviens pas désinvolture que vous devez définir également l'audio mode à MODE_IN_CALL
lors de l'utilisation du flux d'appel vocal (comme ceci: AudioManager.setMode(AudioManager.MODE_IN_CALL)
). Si vous trouvez ce qui est nécessaire, alors vous devez vous assurer que vous revenez au mode MODE_NORMAL
une fois la lecture terminée, sinon chaque fois que vous appuyez sur les touches de volume dur, il va dire « en cours d'appel volume »! Toutefois, si et quand vous voulez revenir à MODE_NORMAL
, vous devez vérifier qu'un véritable appel téléphonique ne se produit pas à ce moment-là ...
Peut-être que vous pourriez utiliser un autre type de flux plutôt que l'appel vocal, mais je ne fais que parler de l'expérience de travail sur une application qui pourrait utiliser le haut-parleur ou l'écouteur pour la lecture audio, qui oblige l'utilisation du flux d'appel vocal.
Comme je l'ai dit, le traitement audio est pas particulièrement amusant ...;)
Autres conseils
Il a été 2 ans. Mais j'espère que cela pourrait aider quelqu'un:
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
Remarque: si vous appelez setStreamMute (int, boolean) pour couper le flux n fois, vous devez appeler n fois à nouveau pour rétablir le son (utilisation false
).
La voie appropriée consiste à utiliser la méthode AudioManager.requestAudioFocus(...)
Vous pouvez AudioManager.adjustVolume procédé :
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);