Android:处理耳机按钮事件和向MainActivity发送信息

时间:2016-09-26 04:44:07

标签: android headset

这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式。我读了Android developer guide,但这显然是错误的,因为他们要求开始监听注册班级名称。

am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Wrong

因此,我查看其他示例以更正代码。例如,许多秘密建议已在this question中发布,我还尝试了其他代码,例如this,以及另一个解决方案MediaSession,并清理不需要的我编写此代码:

我实现了类 RemoteControlReceiver 。显然,不需要静态内部类,事实上,请参阅this comment

public class RemoteControlReceiver extends BroadcastReceiver {

        public RemoteControlReceiver() {
            super();
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();
            if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
                KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {
                    Toast.makeText(context, "EVENT!!", Toast.LENGTH_SHORT).show();

                }
            }
        }
    }

然后我在 MainActivity onCreate(){ ...

中注册了意图
    AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    ComponentName mReceiverComponent = new ComponentName(this, RemoteControlReceiver.class);
    am.registerMediaButtonEventReceiver(mReceiverComponent);

registerMediaButtonEventReceiver已被弃用...

在清单中,我在活动标记之后记录过滤器:

<activity>
...
</activity>

<receiver android:name=".RemoteControlReceiver" android:enabled="true">
    <intent-filter android:priority="2147483647">
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

注意:使用静态内部类将是例如“ .MainActivity $ RemoteControlReceiver ”。

我正在努力

compileSdkVersion 24
buildToolsVersion "24.0.0"
...
minSdkVersion 21
targetSdkVersion 24

我的问题在这里:

  • 为什么不推荐使用 registerMediaButtonEventReceiver ?现在似乎所有这些范例都是错误的,但我没有找到关于如何在Android Developer Portal上处理这类问题的信息。
  • 我可以通过哪种方式与MainActivity互动?我的目的是在执行某些耳机操作时对MainActivity执行操作。

1 个答案:

答案 0 :(得分:4)

API 21更改了整个媒体应用API,现在完全围绕MediaSession。您可以直接在registerMediaButtonEventReceiver(PendingIntent)中接收回调,而不是注册BroadcastReceiver(在API 18之前需要)或PendingIntent(通过MediaSession.Callback)。

您可以通过以下代码设置MediaSession

MediaSession.Callback callback = new MediaSession.Callback() {
  @Override
  public void onPlay() {
    // Handle the play button
  }
};
MediaSession mediaSession = new MediaSession(context,
  TAG); // Debugging tag, any string
mediaSession.setFlags(
  MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
  MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setCallback(callback);

// Set up what actions you support and the state of your player
mediaSession.setState(
  new PlaybackState.Builder()
    .setActions(PlaybackState.ACTION_PLAY |
                PlaybackState.ACTION_PAUSE |
                PlaybackState.ACTION_PLAY_PAUSE);
    .setState(PlaybackState.STATE_PLAYING,
      0, // playback position in milliseconds
      1.0); // playback speed

// Call this when you start playback after receiving audio focus
mediaSession.setActive(true);

如果您只想在活动可见的情况下处理媒体按钮,则可以让活动本身处理MediaSession(这样您的Callback就可以成为活动中的变量)。

Best practices in media playback talk from I/O 2016会详细介绍构建精彩媒体应用所需的所有详细信息和其他API,但请注意它使用了MediaSessionCompat以及{{3}中详述的其他支持库类}。