首页 > 解决方案 > 在 Android 中响应耳机上的媒体按钮

问题描述

我正在开发一个需要响应耳机上的按钮按下的应用程序。我一直在研究 MediaSession 和相关课程,并尝试使用它来响应这些按钮按下,只需显示一个显示按下哪个按钮的吐司。据我所知,根本没有调用 MediaSession.Callback,我无法理解原因。在阅读了关于 SO 和其他地方的无休止的问答之后,据我所知,我正在做其他人已经成功完成的事情。我尝试使用各种意图、简单的键码注册广播接收器……似乎没有任何效果。即使从 MediaSession 切换到 MediaSessionCompat 也没有效果。我的信念是需要实现一些东西来允许android向我的应用程序发送媒体通知,但我找不到任何东西,所以我什至不确定这是否是需要做的事情。任何帮助表示赞赏,并提前感谢。

到目前为止我的实现

public class MainActivity extends AppCompatActivity
{
    MediaSessionCompat m_MediaSession;

    final MediaSessionCompat.Callback m_MediaCallback = new MediaSessionCompat.Callback()
    {
        @Override
        public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent)
        {
            Toast.makeText(MainActivity.this, "media button pressed", Toast.LENGTH_SHORT).show();
            return super.onMediaButtonEvent(mediaButtonIntent);
        }
        @Override
        public void onPlay()
        {
            Toast.makeText(MainActivity.this, "play button pressed", Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onPause()
        {
            Toast.makeText(MainActivity.this, "pause button pressed", Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        m_MediaSession = new MediaSessionCompat(getApplicationContext(), "MediaSessionTag");
        m_MediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
        m_MediaSession.setCallback(m_MediaCallback);
        PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder();
        builder.setActions(PlaybackStateCompat.ACTION_PLAY |
                           PlaybackStateCompat.ACTION_PAUSE |
                           PlaybackStateCompat.ACTION_PLAY_PAUSE |
                           PlaybackStateCompat.ACTION_SKIP_TO_NEXT |
                           PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
               .setState(PlaybackStateCompat.STATE_NONE, 0, (float) 1.0);
        m_MediaSession.setPlaybackState(builder.build());
        m_MediaSession.setActive(true);
    }

    @Override
    public void onDestroy()
    {
        m_MediaSession.release();
        super.onDestroy();
    }
}

标签: androidandroid-10.0android-mediasession

解决方案


推荐阅读