Android - могу ли я отключить воспроизведение аудио приложений?
Привет, я новичок в этом. Мой проект самообучения - это небольшое приложение, которое воспроизводит аудио поток новостей. Чтобы быть эффективным, приложение действительно должно прерывать любые воспроизводимые в данный момент медиаплееры (например: Last FM, Imeem, музыкальный проигрыватель, Spotify и т. Д.).
Я не знаю, что будет играть или какое приложение будет играть, но я хочу попросить их всех остановиться, пока я не закончу. Звучит довольно смело, я знаю, но это должно быть возможно, потому что, когда есть входящий звонок, это в основном то, что происходит.
Могу ли я отправить сообщение всем аудиопроигрывателям с просьбой сделать паузу на мгновение? Могу ли я подделать входящий звонок, просто на время, которое требуется?
Благодарю.
4 ответа
Обработка звука на 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
, вы должны убедиться, что подлинный телефонный звонок не происходит в то время...
Возможно, вы могли бы использовать другой тип потока, а не голосовой вызов, но я просто говорю из опыта работы с приложением, которое может использовать либо громкую связь, либо динамик для воспроизведения звука, для которого требуется использование потока голосовых вызовов.
Как я уже говорил, обработка звука не особенно интересна...;)
Прошло 2 года. Но я надеюсь, что это может кому-то помочь
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
Примечание: если вы вызываете setStreamMute(int, boolean), чтобы заглушить поток n раз, вы должны вызвать его n раз, чтобы включить звук (используйте false
).
Надлежащим способом является использование AudioManager.requestAudioFocus(...)
метод
См. http://developer.android.com/reference/android/media/AudioManager.html.
Вы можете попробовать метод AudioManager.adjustVolume:
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);