MediaSession onMediaButtonEvent可以运行几秒钟,然后退出-Android

时间:2019-01-29 05:23:56

标签: android

我一直在试听过去一周从eBay购买的蓝牙按钮上的媒体按钮意图,但无法弄清楚如何在我的Oreo设备上切实可靠地进行操作。我尝试做的第一件事是在我的主要活动中覆盖onKeyDown,每次都能很好地工作。但是,我发现一旦应用程序最小化,就不可能监听这些呼叫。

接下来,我尝试了一种非常棘手的解决方案,即逐行读取logcat并检查该行中是否存在dispatched media key KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MEDIA_NEXT。一切正常,直到我再次退出该应用程序,然后它将完全停止。

最后,我尝试使用MediaSessiononMediaButtonEvent方法,这种方法在开始我的活动后几秒钟到几分钟就可以正常工作,然后完全停止接收这些意图。

现在是我的代码(我在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秒左右运行一次音频代码,但这仍然没有效果。唯一会重置它的方法是完全重新启动应用程序。

此代码在我创建的服务中。如果我不在应用程序中,它只会停止工作,只需在几秒钟后按主页按钮即可将其最小化。我有一个循环正在运行,以告诉我该服务仍在运行,并且当它退出接收意图时似乎正在运行。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我已经测试了此代码,似乎只有在当前正在播放音乐(或无声声音)的情况下,您的应用才能收听到蓝牙按钮的按下。否则,无法检测到按钮按下。