Android - kann ich zur Zeit Mute Wiedergabe von Audio-Anwendungen?
-
22-09-2019 - |
Frage
Hallo, ich bin neu in diesem. Mein Selbstlernprojekt ist eine kleine Anwendung, die einen Audio-Nachrichtenstrom spielt. Um wirksam zu sein, muss die Anwendung wirklich alle derzeit Media-Player spielen zu unterbrechen (zB: Last FM, Imeem, Musik-Player, Spotify, etc.).
Ich weiß nicht, was spielen wird oder welche Anwendung wird es spielen, aber ich will sie alle bitten, zu pausieren, bis ich getan habe. Sounds eher fett, ich weiß, aber es muss möglich sein, denn wenn ist ein Anruf eingeht, das ist im Grunde, was passiert.
Kann ich eine Nachricht an alle Audio-Player senden sie für einen Moment innehalten zu fragen? Könnte ich einen eingehenden Anruf vortäuschen, nur für die Zeit es braucht?
Danke.
Lösung
Audio Handling auf Android wird eine Zeit lang ziemlich schrecklich sein. Die APIs sind ziemlich komisch, schlecht dokumentiert, und ändern sich ständig / deprecating / Bruch zwischen den Versionen. Auch der AudioManager
Code hat FIXMEs drin.
Wie auch immer, es gibt mehr Stream-Typen in Android (Musik, Mitteilungen, Telefonanrufe, etc.) und Anwendungen sollen die passenden für die Wiedergabe wählen. Ich stelle mir die Mehrheit der Android-Anwendungen sollten die Musik / Medientyp (STREAM_TYPE_MUSIC
) verwenden. Sie setzen diese auf Ihrem MediaPlayer
die setAudioStreamType
Methode.
Das SDK erlaubt es Ihnen einen einzelnen Stream auf type als Solo - was alle anderen Ströme stumm geschaltet werden - aber ich glaube nicht, dass Sie das Audio Wesen wieder durch bestimmte Anwendungen gespielt identifizieren können und irgendwie Pause / unpause es. Musik-Anwendungen im Allgemeinen nutzen die PhoneStateListener
selbst zu unterbrechen, wenn ein Anruf eingeht.
Also in Ihrem Fall, Sie könnten „borrow“ der Anruf Strom für Ihre MediaPlayer
und den Methodenaufruf AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)
verwenden, wenn die Wiedergabe beginnt, dann un-Solo der Strom mit false
, wenn die Wiedergabe oder Ihre Activity
durchgeführt wird.
Ich kann Ihnen sagen, dass dies funktioniert, aber ich kann mich nicht erinnern, freihändig, ob Sie auch das Audio festlegen müssen Modus zu MODE_IN_CALL
wenn der Sprachanruf Strom mit (wie dieser: AudioManager.setMode(AudioManager.MODE_IN_CALL)
). Wenn Sie feststellen, dass erforderlich ist, dann müssen Sie stellen Sie sicher, um den Modus zu MODE_NORMAL
einmal die Wiedergabe abgeschlossen ist zurückzukehren, andernfalls, wenn Sie die Lautstärke harten Tasten drücken, wird es sagen, „In-Call-Volumen“! Wenn jedoch und wenn Sie MODE_NORMAL
zu ändern zurück wollen, müssen Sie prüfen, ob ein echter Anruf zu dieser Zeit nicht geschieht ...
Vielleicht könnten Sie einen anderen Stream-Typ verwenden, anstatt die Sprachanruf, aber ich bin nur aus Erfahrung sprechen auf einer App arbeiten, die entweder mit dem Lautsprecher oder den Hörer für die Audiowiedergabe verwenden könnte, die erfordert die Verwendung des Sprachanruf Stream.
Wie ich schon sagte, Audio-Behandlung ist nicht besonders Spaß ...;)
Andere Tipps
Es verfügt über 2 Jahre. Aber ich hoffe, dass dies jemand helfen könnte:
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
Hinweis: , wenn Sie setStreamMute (int, boolean) den Strom stumm zu schalten n Zeiten, müssen Sie es nennen n mal wieder unmute (Verwendung false
).
Die Möglichkeit ist, das AudioManager.requestAudioFocus(...)
Methode zu verwenden,
Sie können versuchen, AudioManager.adjustVolume Methode:
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);