我一直在试听过去一周从eBay购买的蓝牙按钮上的媒体按钮意图,但无法弄清楚如何在我的Oreo设备上切实可靠地进行操作。我尝试做的第一件事是在我的主要活动中覆盖onKeyDown
,每次都能很好地工作。但是,我发现一旦应用程序最小化,就不可能监听这些呼叫。
接下来,我尝试了一种非常棘手的解决方案,即逐行读取logcat并检查该行中是否存在dispatched media key KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MEDIA_NEXT
。一切正常,直到我再次退出该应用程序,然后它将完全停止。
最后,我尝试使用MediaSession
和onMediaButtonEvent
方法,这种方法在开始我的活动后几秒钟到几分钟就可以正常工作,然后完全停止接收这些意图。
现在是我的代码(我在StackOverflow上复制了另一个答案,其中包括播放一个虚拟音频片段以尝试获得焦点):
MediaSession ms = new MediaSession(getApplicationContext(), getPackageName());
ms.setActive(true);
ms.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
KeyEvent keyEvent = (KeyEvent) mediaButtonIntent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyEvent.getKeyCode()) {
//do button specific stuff here
}
}
return super.onMediaButtonEvent(mediaButtonIntent);
}
});
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
PendingIntent mediaButtonReceiverPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);
ms.setMediaButtonReceiver(mediaButtonReceiverPendingIntent);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
AudioTrack.getMinBufferSize(48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);
at.play();
// a little sleep
at.stop();
at.release();
我现在正试图弄清楚,为什么它似乎可以完美地工作几秒钟,然后它突然消失了。我没有打开或播放Spotify之类的其他媒体应用程序,如果这是问题所在,我尝试每隔5秒左右运行一次音频代码,但这仍然没有效果。唯一会重置它的方法是完全重新启动应用程序。
此代码在我创建的服务中。如果我不在应用程序中,它只会停止工作,只需在几秒钟后按主页按钮即可将其最小化。我有一个循环正在运行,以告诉我该服务仍在运行,并且当它退出接收意图时似乎正在运行。
任何帮助将不胜感激。
答案 0 :(得分:1)
我已经测试了此代码,似乎只有在当前正在播放音乐(或无声声音)的情况下,您的应用才能收听到蓝牙按钮的按下。否则,无法检测到按钮按下。