Как я могу разумно управлять громкостью звука в моем приложении для Android?

У меня есть приложение, которое воспроизводит прерывистые звуки, когда его активность открыта, и пользователь всегда ожидает, что он издаст эти шумы, но, к сожалению, он ограничен громкостью музыкального потока. Варианты, которые я обнаружил, таковы:

  1. Отрегулируйте громкость музыкального потока, возможно, оглушая пользователя, если он проигрывает музыку в то время.
  2. Вызовите MediaPlayer.setVolume(), который неэффективен, если громкость музыкального потока равна 0.
  3. Нажатие кнопки регулировки громкости вызывает две проблемы: нажатие кнопки регулировки громкости регулирует громкость звонка, пока не воспроизводится мой звук, и я до сих пор не смог отловить событие onKey для нажатия кнопки регулировки громкости с помощью моего OnKeyListener. Если бы был какой-то способ заставить настройку применить к музыкальному потоку, когда моя деятельность сфокусирована, или просто ловить нажатие кнопки, это сработало бы.
  4. Воспроизведите тихий зацикленный звук на заднем плане, чтобы сохранить музыкальный поток в контексте для регулировки громкости.

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

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