Android: могу ли я отключить звук воспроизводимых в данный момент аудиоприложений?
-
22-09-2019 - |
Вопрос
Привет, я новичок в этом.Мой проект самообучения представляет собой небольшое приложение, воспроизводящее аудиопоток новостей.Чтобы быть эффективным, приложению действительно необходимо прерывать любые воспроизводимые в данный момент медиаплееры (например: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(...)
метод
Можешь попробовать AudioManager.adjustVolume метод:
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);