有没有办法通过 Android 服务监听音量变化并做出反应?
顺便说一句:即使音乐在后台播放,Google 音乐应用程序如何允许用户控制媒体音量?
查看
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()
中注销接收器
对于使用 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
感兴趣。确保定位与您的应用程序相关的音频流。