Привет я плохо знаком с этим. Мой проект самообразования является небольшим приложением, которое играет аудио поток новостей. Чтобы быть эффективным, приложение действительно должно прервать любые в настоящее время медиаплееры проигрывания (например: Последний FM, Imeem, аудиоплеер, Spotify и т.д.).
Я не знаю то, что будет играть или какое приложение будет играть его, но я хочу попросить, чтобы они все приостановились, пока я не сделал. Звучит довольно полужирным, я знаю, но должно быть возможно, потому что, когда существует входящий вызов, это в основном, что происходит.
Я могу отправить сообщение на все аудиоплееры, просящие, чтобы они приостановились на мгновение? Я мог имитировать входящий вызов, только в течение времени, которое требуется?
Спасибо.
Обработка звука на Android какое-то время будет довольно ужасной. API довольно странные, плохо документированы и продолжают меняться/удаляться/разрываться между версиями. Даже в коде AudioManager
есть FIXME.
В любом случае, в Android есть несколько типов потоков (музыка, уведомления, телефонные звонки и т.д.), и приложения предназначены для выбора подходящего для воспроизведения. Полагаю, что большинство Android-приложений должны использовать тип "музыка/медиа" (STREAM_TYPE_MUSIC
). Вы устанавливаете это на вашем MediaPlayer
, используя метод setAudioStreamType
.
SDK действительно позволяет вам установить один поток типа в качестве сольного, что приведет к отключению звука всех остальных потоков, но я не верю, что вы сможете определить звук, который воспроизводится определенными приложениями, и каким-то образом приостановить/отключить его. Музыкальные приложения в целом используют PhoneStateListener
, чтобы поставить себя на паузу при поступлении вызова.
Таким образом, в вашем случае, вы можете "одолжить" поток телефонных вызовов для вашего MediaPlayer
и использовать вызов метода AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)
, когда начинается воспроизведение, затем отсоединить поток с помощью false
, когда воспроизведение или ваша Activity
выполнена.
Могу сказать, что это работает, но я не могу вспомнить, нужно ли вам также установить аудио режим на MODE_IN_CALL
при использовании потока голосового вызова (подобно этому: AudioManager.setMode(AudioManager.MODE_IN_CALL)
). Если Вы считаете, что это необходимо, то необходимо убедиться, что по окончании воспроизведения необходимо вернуть режим в MODE_NORMAL
, иначе при нажатии жестких клавиш регулировки громкости будет написано "Вызов по громкости"! Однако, если и когда вы захотите вернуться обратно к MODE_NORMAL
, вы должны убедиться, что настоящий телефонный звонок в это время не происходит....
Может быть, вы могли бы использовать другой тип потока, а не голосовой вызов, но я просто говорю по опыту работы с приложением, которое может использовать для воспроизведения звука либо спикерфон, либо наушник, для которого требуется использование потока голосового вызова.
Как я уже говорил, работа со звуком не особо интересна... ;)
Можно попробовать метод AudioManager.adjustVolume :
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);