Как я могу разумно управлять громкостью звука в моем приложении для Android?
У меня есть приложение, которое воспроизводит прерывистые звуки, когда его активность открыта, и пользователь всегда ожидает, что он издаст эти шумы, но, к сожалению, он ограничен громкостью музыкального потока. Варианты, которые я обнаружил, таковы:
- Отрегулируйте громкость музыкального потока, возможно, оглушая пользователя, если он проигрывает музыку в то время.
- Вызовите MediaPlayer.setVolume(), который неэффективен, если громкость музыкального потока равна 0.
- Нажатие кнопки регулировки громкости вызывает две проблемы: нажатие кнопки регулировки громкости регулирует громкость звонка, пока не воспроизводится мой звук, и я до сих пор не смог отловить событие onKey для нажатия кнопки регулировки громкости с помощью моего OnKeyListener. Если бы был какой-то способ заставить настройку применить к музыкальному потоку, когда моя деятельность сфокусирована, или просто ловить нажатие кнопки, это сработало бы.
- Воспроизведите тихий зацикленный звук на заднем плане, чтобы сохранить музыкальный поток в контексте для регулировки громкости.
Я думаю, что третий вариант, вероятно, лучше, так как он уступает контроль громкости пользователю, но если бы был какой-то способ просто переопределить системную громкость в одном экземпляре медиаплеера, который бы тоже работал.
4 ответа
Еще одно предложение от Google Groups - интегрированное платформенное решение, которое я искал и работает нормально:
Пожалуйста, не обращайтесь с клавишами громкости самостоятельно - почти невозможно гарантировать, что вы не нарушите поведение клавиш громкости.
Вызовите этот API в вашем onCreate ():
setVolumeControlStream (AudioManager.STREAM_MUSIC);
Это говорит AudioManager, что когда ваше приложение имеет фокус, клавиши регулировки громкости должны регулировать громкость музыки.
Этот API полезен: setVolumeControlStream(AudioManager.STREAM_MUSIC);
Если это не так, я потрачу больше времени на исправление ошибки громкости.
Если вы используете метод OnKeyDown, вы можете обойти эту проблему, выполнив следующие действия:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
setVolumeControlStream(AudioManager.STREAM_MUSIC);}}
Это не поможет вам, если у вас есть переопределение метода действия onKeyDown(int keycode,KeyEvent).
var audioManager:AudioManager?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registerReceiver(mVolumeReceiver, IntentFilter("android.media.VOLUME_CHANGED_ACTION"))
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
}
private var mVolumeReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == "android.media.VOLUME_CHANGED_ACTION") {
var currentVolume = audioManager?.getStreamVolume(AudioManager.STREAM_MUSIC)
}
}
}