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);
Другие вопросы по тегам