Android MediaSessionCompat onMediaButtonEvent 不起作用

问题描述

我希望能够检测到头座上的暂停按钮何时被按下(没有媒体播放时)

我尝试了各种接收器和服务,但没有任何效果。直到我从一个非常老的例子中删除了所有膨胀之后,我测试了这段代码

import android.content.ComponentName
import android.content.Intent
import android.os.Bundle
import android.support.v4.media.session.MediaSessionCompat
import androidx.appcompat.app.AppCompatActivity
import androidx.media.session.MediaButtonReceiver


class MainActivity : AppCompatActivity() {
    private lateinit var mMediaSessionCompat: MediaSessionCompat
    private val mMediaSessionCallback: MediaSessionCompat.Callback = object : MediaSessionCompat.Callback() {
        override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean {
            println("WORKS!!!")
            return super.onMediaButtonEvent(mediaButtonEvent)
        }
    }

    private fun initMediaSession() {
        val mediaButtonReceiver = ComponentName(applicationContext,MediaButtonReceiver::class.java)
        mMediaSessionCompat = MediaSessionCompat(applicationContext,"Tag",mediaButtonReceiver,null)
        mMediaSessionCompat.setCallback(mMediaSessionCallback)
        mMediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
        mMediaSessionCompat.isActive = true
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initMediaSession()
        setContentView(R.layout.activity_main)
    }

    override fun onDestroy() {
        super.onDestroy()
        mMediaSessionCompat.release()
    }
}

这段代码工作了一段时间,但由于某种原因在其他项目中不起作用,重新启动后这段代码不再起作用。我没有理由让它停止工作,但我试图让它工作几个小时,但我不明白为什么它不起作用。有人可以给我一个最低限度的可重复示例吗,或者指出我遗漏了什么。

解决方法

我通过简单地播放虚拟声音解决了这个问题

private fun playDummySound() {
    val mMediaPlayer: MediaPlayer = MediaPlayer.create(this,R.raw.dummy_sound_500ms)
    mMediaPlayer.setOnCompletionListener { mMediaPlayer.release() }
    mMediaPlayer.start()
}

取自https://github.com/anars/blank-audio

问题已通过 Android "O" (Oreo,8) and higher media buttons issue 中的解决方案解决