首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android MediaSession setActive(false)不工作

android MediaSession setActive(false)不工作
EN

Stack Overflow用户
提问于 2020-09-29 04:11:26
回答 2查看 641关注 0票数 0

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

从android文档中,它说setActive方法用于,“如果这个会话当前处于活动状态并准备接收命令”。但是它没有起作用,我还可以在活动暂停的时候用头继续音乐。我是否误解了这种方法的作用?

我的代码如下:

代码语言:javascript
复制
@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))
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-29 06:45:02

文档说:

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

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

因此,根据这些文档,您应该使用releasesetCallback(null)

票数 0
EN

Stack Overflow用户

发布于 2022-03-03 18:27:58

记录在案:对我来说,setCallback(null)没有工作,因为我错误地在Manifest.xml中添加了两个MEDIA_BUTTON.BroadcastReceiver。这在没有附加Service的背景下以某种方式启动了Activity

代码语言:javascript
复制
 <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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64112772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档