natt
natt

Reputation: 21

How to Detect When Users Continue to Increase Volume Beyond Maximum Using AudioManager in Android (Kotlin)?

I am currently implementing a custom audio manager in my Android application to listen for volume changes using AudioManager and a BroadcastReceiver for the action android.media.VOLUME_CHANGED_ACTION. However, I can't detect when the user continues to press the volume-up button after reaching the maximum volume.

Here is my implementation:

class OHAudioManagerImpl @Inject constructor(private val serviceProvider: EnvironmentServiceProvider) : OHAudioManager {
    private val context = serviceProvider.providerApplication().applicationContext

    private val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    private var currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
    private var isMuted = audioManager.isStreamMute(AudioManager.STREAM_MUSIC)
    private var listener: AudioChangeListener? = null

    val keyVolumeChangedAction = "android.media.VOLUME_CHANGED_ACTION"


    private val volumeChangeReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == keyVolumeChangedAction) {
                handleVolumeChange()
            }
        }
    }

    override fun onVolumeChangeListener(listener: AudioChangeListener?) {
        this.listener = listener
    }
    
    override fun register() {
        val filter = IntentFilter(keyVolumeChangedAction)
        context.registerReceiver(volumeChangeReceiver, filter)
    }
    
    override fun unregister() {
        context.unregisterReceiver(volumeChangeReceiver)
    }
    
    private fun handleVolumeChange() {
        val newVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
        val newMuteState = audioManager.isStreamMute(AudioManager.STREAM_MUSIC)
        
        if (newMuteState != isMuted) {
            isMuted = newMuteState
            listener?.onVolumeChanged(if (isMuted) OHAudioChangeState.Mute else OHAudioChangeState.UnMute)
        }

        when {
            newVolume > currentVolume -> {
                listener?.onVolumeChanged(OHAudioChangeState.VolumeUp)
            }

            newVolume < currentVolume -> {
                listener?.onVolumeChanged(OHAudioChangeState.VolumeDown)
            }
        }
        
        currentVolume = newVolume
    }
}

The problem is that I can only detect volume changes when the volume level changes. When the user presses the volume-up button while the volume is already at its maximum, no additional events are triggered.

I want to detect when the user continues pressing the volume-up button after the volume has already reached its maximum level.

Is there any workaround or alternative approach, thanks everyone.

Upvotes: 1

Views: 33

Answers (0)

Related Questions