java - 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))
}
}
解决方案
文档说:
设置此会话当前是否处于活动状态并准备好接收命令。如果设置为 false,您的会话控制器可能无法被发现。您必须将会话设置为活动状态,然后它才能开始接收媒体按钮事件或传输命令。
它并没有说您应该将其设置为 false 以停止接收命令。我想如果控制器已经被发现,值就不再重要了。
因此,您应该使用release
orsetCallback(null)
根据本文档。
推荐阅读
- r - 从一列中分离出两种数据类型
- javascript - Javascript 中 API POST 方法的 HTML 特殊字符 - Google Script
- python - Pandas 多索引:根据索引号选择列
- javascript - 用于相同类型对象的 Typescript 接口,但必须具有所有字段,而其他对象可能会跳过字段
- lotus-notes - 如何在 Domino 目录中仅注册 Web 用户(没有 lotus notes id 文件)
- c++ - 负零整数
- css - 格式化日期反应
- azure - 我有一个 API 部署到 Azure VM。我想将此 API 的所有控制台输出发送到一些云文本存储以供阅读我该怎么做?
- wordpress - 密码保护页面在更改密码后不接受有效密码
- node.js - node.js:回调后返回布尔值