首页 > 解决方案 > android MediaSession setActive(false) 不起作用

问题描述

MediaSession用来响应耳机媒体按钮,并希望在活动暂停时停止声音。我还想让耳机媒体按钮在活动暂停时不活动。

从android文档中,它说该setActive方法用于“设置此会话当前是否处于活动状态并准备好接收命令”。但它不起作用,当活动暂停时,我仍然可以使用 head 恢复音乐。我误解了这个方法的功能吗?

我的代码如下:

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class MainActivity : AppCompatActivity() {

private lateinit var mediaSession: MediaSession
private var mediaPlayer: MediaPlayer? = null

public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main)

    mediaPlayer = MediaPlayer.create(this, R.raw.lapple)
    mediaPlayer?.isLooping = true
    mediaPlayer?.start()
    // Create a MediaSessionCompat

    mediaSession = MediaSession(this, "test_log").apply {

        // Enable callbacks from MediaButtons and TransportControls
        setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS or MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS)

        // Do not let MediaButtons restart the player when the app is not visible
        setMediaButtonReceiver(null)

        // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player
        val stateBuilder = PlaybackState.Builder()
            .setActions(PlaybackState.ACTION_PLAY or PlaybackState.ACTION_PAUSE or PlaybackState.ACTION_PLAY_PAUSE)
        setPlaybackState(stateBuilder.build())

        // MySessionCallback has methods that handle callbacks from a media controller
        setCallback(object : MediaSession.Callback() {
            override fun onPlay() {
                Toast.makeText(
                    this@MainActivity,
                    "${this@MainActivity.hashCode()}: onPlay",
                    Toast.LENGTH_SHORT
                ).show()
                mediaPlayer?.start()
            }

            override fun onPause() {
                mediaPlayer?.pause()
                Toast.makeText(
                    this@MainActivity,
                    "${this@MainActivity.hashCode()}: onPause",
                    Toast.LENGTH_SHORT
                ).show()
            }

        })
    }

    mediaSession.isActive = true

    //mediaController = MediaController(this, mediaSession.sessionToken)

}

override fun onPause() {
    super.onPause()
    mediaSession.isActive = false
    mediaPlayer?.pause()
}

override fun onResume() {
    super.onResume()
    mediaSession.isActive = true
    mediaPlayer?.start()
}

override fun onDestroy() {
    mediaPlayer?.release()
    super.onDestroy()
}

fun newActivity(view: View) {
    startActivity(Intent(this, MainActivity::class.java))
}
}

标签: javaandroidkotlin

解决方案


文档说:

设置此会话当前是否处于活动状态并准备好接收命令。如果设置为 false,您的会话控制器可能无法被发现。您必须将会话设置为活动状态,然后它才能开始接收媒体按钮事件或传输命令。

它并没有说您应该将其设置为 false 以停止接收命令。我想如果控制器已经被发现,值就不再重要了。

因此,您应该使用releaseorsetCallback(null)根据本文档。


推荐阅读