音量变化监听器?

问题描述 投票:0回答:2

有没有办法通过 Android 服务监听音量变化并做出反应?

顺便说一句:即使音乐在后台播放,Google 音乐应用程序如何允许用户控制媒体音量?

android service broadcastreceiver media volume
2个回答
12
投票

查看

registerMediaButtonEventReceiver(ComponentName broadcastReceiver);

定义一个处理

BroadcastReceiver
ACTION_MEDIA_BUTTON
。收到的
intent
包含一个额外字段
EXTRA_KEY_EVENT
,其中包含导致广播的关键事件。您可以使用此按键事件来获取按下了哪个键。


编辑:
这只是一个示例代码。可能存在语法错误。

// in onCreate of activity
registerMediaButtonEventReceiver(mediaReceiver ); 

// later somewhere in activity.
MediaButton_Receiver mediaReceiver = new MediaButton_Receiver();

class MediaButton_Receiver implements BroadcastReceiver {
     void onReceive(Intent intent) {

          KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT); 
          if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) {

          }
          // Similarly other key codes .......
     } 
}

onPause()
onStop()

中注销接收器

0
投票

对于使用 kotlin 流的用户,您可以使用以下方法来监听特定流的音量变化:

val Context.musicVolumeFlow
    get() = callbackFlow {
        val receiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_TYPE", 0)) {
                    AudioManager.STREAM_MUSIC -> trySend(
                        intent.getIntExtra(
                            "android.media.EXTRA_VOLUME_STREAM_VALUE",
                            0
                        )
                    )
                }
            }
        }

        registerReceiver(receiver, IntentFilter("android.media.VOLUME_CHANGED_ACTION"))
        awaitClose { unregisterReceiver(receiver) }
    }

然后,您可以从服务中按如下方式收集它(在本例中为

LifecycleService
,但您可以使用自己的协程作用域):

lifecycleScope.launch {
    musicVolumeFlow.collect { Log.d("AppLog", "stream volume: $it") }
}

注意此示例仅对

AudioManager.STREAM_MUSIC
感兴趣。确保定位与您的应用程序相关的音频流。

© www.soinside.com 2019 - 2024. All rights reserved.