抓不到android.intent.action.MEDIA_BUTTON
Fail to catch android.intent.action.MEDIA_BUTTON
我的应用程序使用 TextToSpeech 来阅读一些文本,完成了 90%,但已经在这部分停留了几天。我想要的只是让我的蓝牙耳机(小米的 Mi 运动蓝牙耳机)的 play/pause 按钮到 play/pause TextToSpeech。我认为这是我需要捕捉的android.intent.action.MEDIA_BUTTON,所以我添加了这些:
在AndroidManifest.xml中:
<receiver android:name=".ButtonReceiver">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
然后classButtonReceiver.java
public class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "debug media button test", Toast.LENGTH_LONG).show();
// will finish the code once I catch this intent
}
}
调试文本未显示。虽然如果我将 <action android:name="android.intent.action.MEDIA_BUTTON"/>
更改为 <action android:name="android.media.VOLUME_CHANGED_ACTION"/>
,当我按耳机的音量调高或调低时它确实会显示文本,但这并不是我想要的。我只希望应用响应 play/pause 按钮。
然后我读到我需要使用 registerMediaButtonEventReceiver
,所以我尝试在我的 MainActivity.java 中添加它:
private AudioManager audioManager;
private ComponentName componentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
componentName = new ComponentName(this, ButtonReceiver.class);
audioManager.registerMediaButtonEventReceiver(componentName);
}
还是不行。另外,它说 registerMediaButtonEventReceiver
已弃用,所以我想知道这是否是它不起作用的原因。
进一步阅读 official document page,它告诉我们:
If you are running Android 5.0 (API level 21) or later, call
FLAG_HANDLES_MEDIA_BUTTONS
MediaBrowserCompat.ConnectionCallback.onConnected. This will
automatically call your media controller's dispatchMediaButtonEvent(),
which translates the key code to a media session callback.
我觉得这很愚蠢,因为我不需要这个额外的模块来播放媒体。我只需要检测耳机按钮是否按下。无论如何,我尝试实现 MediaSession 但很快就放弃了,因为它很快就以太多对我的应用程序无用的代码告终,因为我的应用程序不是音频播放器应用程序!
有什么建议吗?我该怎么办?
我终于自己找到了解决办法!我没有制作单独的 BroadcastReceiver class,而是在我的 MainActivity.java:
中添加了一个 public static class
public static class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Toast.makeText(context, "debug media button test", Toast.LENGTH_SHORT).show();
...
}
}
然后在onCreate中添加这一行:
((AudioManager)getSystemService(AUDIO_SERVICE))
.registerMediaButtonEventReceiver(new ComponentName(this, ButtonReceiver.class));
最后在 AndroidManifest.xml:
<receiver android:name=".MainActivity$ButtonReceiver"
android:enabled="true">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
有效!该应用现在可以通过此设置捕获 MEDIA_BUTTON 意图!
我的应用程序使用 TextToSpeech 来阅读一些文本,完成了 90%,但已经在这部分停留了几天。我想要的只是让我的蓝牙耳机(小米的 Mi 运动蓝牙耳机)的 play/pause 按钮到 play/pause TextToSpeech。我认为这是我需要捕捉的android.intent.action.MEDIA_BUTTON,所以我添加了这些:
在AndroidManifest.xml中:
<receiver android:name=".ButtonReceiver">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
然后classButtonReceiver.java
public class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "debug media button test", Toast.LENGTH_LONG).show();
// will finish the code once I catch this intent
}
}
调试文本未显示。虽然如果我将 <action android:name="android.intent.action.MEDIA_BUTTON"/>
更改为 <action android:name="android.media.VOLUME_CHANGED_ACTION"/>
,当我按耳机的音量调高或调低时它确实会显示文本,但这并不是我想要的。我只希望应用响应 play/pause 按钮。
然后我读到我需要使用 registerMediaButtonEventReceiver
,所以我尝试在我的 MainActivity.java 中添加它:
private AudioManager audioManager;
private ComponentName componentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
componentName = new ComponentName(this, ButtonReceiver.class);
audioManager.registerMediaButtonEventReceiver(componentName);
}
还是不行。另外,它说 registerMediaButtonEventReceiver
已弃用,所以我想知道这是否是它不起作用的原因。
进一步阅读 official document page,它告诉我们:
If you are running Android 5.0 (API level 21) or later, call FLAG_HANDLES_MEDIA_BUTTONS MediaBrowserCompat.ConnectionCallback.onConnected. This will automatically call your media controller's dispatchMediaButtonEvent(), which translates the key code to a media session callback.
我觉得这很愚蠢,因为我不需要这个额外的模块来播放媒体。我只需要检测耳机按钮是否按下。无论如何,我尝试实现 MediaSession 但很快就放弃了,因为它很快就以太多对我的应用程序无用的代码告终,因为我的应用程序不是音频播放器应用程序!
有什么建议吗?我该怎么办?
我终于自己找到了解决办法!我没有制作单独的 BroadcastReceiver class,而是在我的 MainActivity.java:
中添加了一个 public static classpublic static class ButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Toast.makeText(context, "debug media button test", Toast.LENGTH_SHORT).show();
...
}
}
然后在onCreate中添加这一行:
((AudioManager)getSystemService(AUDIO_SERVICE))
.registerMediaButtonEventReceiver(new ComponentName(this, ButtonReceiver.class));
最后在 AndroidManifest.xml:
<receiver android:name=".MainActivity$ButtonReceiver"
android:enabled="true">
<intent-filter
android:priority="10000">
<action android:name="android.intent.action.MEDIA_BUTTON"/>
</intent-filter>
</receiver>
有效!该应用现在可以通过此设置捕获 MEDIA_BUTTON 意图!