我使用MediaSession响应耳机媒体按钮,并希望在暂停活动时停止声音。I还希望在活动暂停时使耳机媒体按钮不活动。
从android文档中,它说setActive方法用于,“如果这个会话当前处于活动状态并准备接收命令”。但是它没有起作用,我还可以在活动暂停的时候用头继续音乐。我是否误解了这种方法的作用?
我的代码如下:
@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))
}
}发布于 2020-09-29 06:45:02
文档说:
如果此会话当前处于活动状态并已准备好接收命令,则设置。如果设置为false,则可能无法发现会话的控制器。必须将会话设置为active,然后会话才能开始接收媒体按钮事件或传输命令。
它并不是说您应该将其设置为false以停止接收命令。我想如果控制器已经被发现了,那么这个值就不再重要了。
因此,根据这些文档,您应该使用release或setCallback(null)。
发布于 2022-03-03 18:27:58
记录在案:对我来说,setCallback(null)没有工作,因为我错误地在Manifest.xml中添加了两个MEDIA_BUTTON.BroadcastReceiver。这在没有附加Service的背景下以某种方式启动了Activity
<application>
<service
android:name=".service.MyService">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
<!-- this was the stupid receiver. DO NOT DO IT ;-) -->
<receiver android:name="androidx.media.session.MediaButtonReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
</application>https://stackoverflow.com/questions/64112772
复制相似问题