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.requestAudioFocus(...) метод

посмотреть http://developer.android.com/reference/android/media/AudioManager.html#requestAudioFocus%28android.media.AudioManager.OnAudioFocusChangeListener,%20int,%20int%29


вы можете попробовать AudioManager.adjustVolume способ:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);