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

StackOverflow https://stackoverflow.com/questions/1993471

Вопрос

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

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

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

Спасибо.

Это было полезно?

Решение

Обработка звука на 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 (целое, логическое значение) отключить поток н раз, ты должен назвать это н еще раз, чтобы включить звук (используйте 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top