Android - я могу отключить звук в настоящее время аудиоприложений проигрывания?

Привет я плохо знаком с этим. Мой проект самообразования является небольшим приложением, которое играет аудио поток новостей. Чтобы быть эффективным, приложение действительно должно прервать любые в настоящее время медиаплееры проигрывания (например: Последний FM, Imeem, аудиоплеер, Spotify и т.д.).

Я не знаю то, что будет играть или какое приложение будет играть его, но я хочу попросить, чтобы они все приостановились, пока я не сделал. Звучит довольно полужирным, я знаю, но должно быть возможно, потому что, когда существует входящий вызов, это в основном, что происходит.

Я могу отправить сообщение на все аудиоплееры, просящие, чтобы они приостановились на мгновение? Я мог имитировать входящий вызов, только в течение времени, которое требуется?

Спасибо.

10
задан trgraglia 30 January 2012 в 10:38
поделиться

2 ответа

Обработка звука на 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, вы должны убедиться, что настоящий телефонный звонок в это время не происходит....

Может быть, вы могли бы использовать другой тип потока, а не голосовой вызов, но я просто говорю по опыту работы с приложением, которое может использовать для воспроизведения звука либо спикерфон, либо наушник, для которого требуется использование потока голосового вызова.

Как я уже говорил, работа со звуком не особо интересна... ;)

18
ответ дан 3 December 2019 в 16:10
поделиться

Можно попробовать метод AudioManager.adjustVolume :

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
0
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: