Android-могу ли я отключить воспроизведение аудио приложений?
Привет, я новичок в этом. Мой проект самообучения-это небольшое приложение, которое воспроизводит аудиопоток новостей. Чтобы быть эффективным, приложение действительно должно прерывать любые воспроизводимые в настоящее время медиаплееры (например: Last FM, Imeem, music player, Spotify и т. д.).
Я не знаю, что будет играть или какое приложение будет играть, но я хочу попросить их всех сделать паузу, пока я не закончу. Звучит довольно смело, я знаю, но это должно быть возможно, потому что когда есть входящий звонок, в основном так и происходит.
могу ли я отправить сообщение всем аудиоплеерам с просьбой сделать паузу на мгновение? Могу ли я сфальсифицировать входящий звонок, просто на время?
спасибо.
4 ответов
обработка звука на Android будет довольно ужасной в течение некоторого времени. API довольно странные, плохо документированные и продолжают меняться/осуждать/ломаться между версиями. Даже AudioManager
в коде есть FIXMEs.
в любом случае, в Android есть несколько типов потоков (музыка, уведомления, телефонные звонки и т. д.) и приложения предназначены для выбора подходящего для воспроизведения. Я предполагаю, что большинство приложений для Android должны использовать тип музыки / мультимедиа (STREAM_TYPE_MUSIC
). Вы поставлю на MediaPlayer
С помощью setAudioStreamType
метод.
SDK позволяет установить один поток тип как соло-вызывая все другие потоки, чтобы быть приглушенным - но я не верю, что вы можете определить аудио воспроизводится конкретными приложениями и как-то приостановить/отменить его. Музыкальные приложения в целом будут использовать PhoneStateListener
чтобы приостановить себя, когда поступает вызов.
так в вашем случае, вы смогли "одолжить" поток телефонного звонка для вашего MediaPlayer
и используйте вызов метода AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)
когда начинается воспроизведение, затем un-solo поток с false
при воспроизведении или ваш Activity
сделано.
Я могу сказать вам, что это работает, но я не могу вспомнить с ходу, нужно ли вам также установить аудио режим to MODE_IN_CALL
при использовании потока голосовых вызовов (например:AudioManager.setMode(AudioManager.MODE_IN_CALL)
). Если вы обнаружите, что это необходимо, то вам нужно убедиться, что вы вернете режим в MODE_NORMAL
после завершения воспроизведения, в противном случае при нажатии клавиши регулировки громкости, он скажет "in-Call volume"! Однако, если и когда вы захотите вернуться к MODE_NORMAL
, вы должны проверить, что подлинный телефонный звонок не происходит в то время...
возможно, вы могли бы использовать другой тип потока, а не голосовой вызов, но я просто говорю из опыта работы над приложением, которое может использовать громкую связь или наушник для воспроизведения звука, который требует использование потока голосовых вызовов.
как Я сказал, обработка звука не особенно весело... ;)
Прошло 2 года. Но я надеюсь, что это может помочь кому-то:
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
Примечание: если вы называете setStreamMute (int, boolean) чтобы отключить поток n раз, вы должны назвать его n раз снова включить (используйте false
).
вы можете попробовать AudioManager.adjustVolume способ:
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);