【发布时间】:2016-09-28 09:48:45
【问题描述】:
这是我努力制作一个工作代码来处理耳机按钮事件的最佳方式。我读了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 开发者门户上没有找到有关如何处理此类问题的信息。
- 我可以通过哪种方式与 MainActivity 交互?我的目的是在执行某些耳机操作后对 MainActivity 执行操作。
【问题讨论】:
-
您的清单显示为
MainActivity$MediaButtonReceiver,但您的课程名称为RemoteControlReceiver。是哪个? -
感谢@ianhanniballake 的提醒。虽然这只是一个复制粘贴错字,但我在所有实验中都实现了许多接收器。现在我更正了,我确认设置与描述的一样。