Android 广播 与回调,始终接收所有Android媒体按钮事件的回调(即使其他应用正在播放音频)...

背景信息:每当用户按下大多数耳机上的播放/暂停按钮时,我都需要检测(KEYCODE_MEDIA_PLAY_PAUSE).

我拥有它主要使用MediaSessions,但当另一个应用程序开始播放音频时,我停止回调.

这似乎是因为正在播放音频的应用创建了自己的MediaSession,而Android仅将KeyEvents发送到最新的MediaSession.为了防止这种情况,我创建一个OnActiveSessionsChangedListener并在每次触发时创建一个新的MediaSession.

这确实有效,但每次我创建一个新的MediaSession时,监听器再次触发,所以我发现自己陷入了一个inf循环.

我的问题:有谁知道我怎么做以下任何一个??:

>防止其他应用程序窃取我的媒体按钮焦点

>检测我何时将媒体按钮焦点丢失到另一个应用程序,这样我就可以创建一个新的MediaSession,而不是每当有效时

会议变了

>检查我当前是否已经有媒体按钮焦点,所以我不必要地创建一个新的MediaSession

什么行不通:

> BroadcastReceiver on

AudioEffect.ACTION_OPEN_AUdio_EFFECT_CONTROL_SESSION不起作用

因为应用必须手动触发广播和许多应用,

像NPR一样不

> AudioManager.OnAudioFocusChangeListener无法正常工作,因为它需要我

音频焦点

>在android.intent.action.MEDIA_BUTTON&上具有最高优先级的BroadcastReceiver调用abortBroadcast(),但当其他应用程序播放音频时,我的接收器未被触发.此外,其他应用程序也可以设置最高优先级.

我的代码:

mMediaSessionManager.addOnActiveSessionsChangedListener(controllers -> {

boolean updateButtonReceiver = false;

// recreate MediaSession if another app handles media buttons

for (MediaController mediaController : controllers) {

if (!TextUtils.equals(getPackageName(),mediaController.getPackageName())) {

if ((mediaController.getFlags() & (MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)) != 0L) {

updateButtonReceiver = true;

}

}

}

if (updateButtonReceiver) {

// using a handler with a delay of about 2 seconds because this listener fires very often.

mAudioFocusHandler.removeCallbacksAndMessages(null);

mAudioFocusHandler.sendEmptyMessageDelayed(0,AUdio_FOCUS_DELAY_MS);

}

},ClickAppNotificationListener.getComponentName(this));

这是被触发的处理程序:

private final Handler mAudioFocusHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

if (mShouldBeEnabled) {

updateButtonReceiverEnabled(true);

}

}

};

最后,这是Handler触发的方法:

private void updateButtonReceiverEnabled(boolean shouldBeEnabled) {

// clear old session (not sure if this is necessary)

if (mMediaSession != null) {

mMediaSession.setActive(false);

mMediaSession.setFlags(0);

mMediaSession.setCallback(null);

mMediaSession.release();

mMediaSession = null;

}

mMediaSession = new MediaSessionCompat(this,MEDIA_SESSION_TAG);

mMediaSession.setCallback(mMediaButtonCallback);

mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

mMediaSession.setPlaybackToLocal(AudioManager.STREAM_MUSIC);

mMediaSession.setActive(true);

mMediaSession.setPlaybackState(new PlaybackStateCompat.Builder()

.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)

.setState(PlaybackStateCompat.STATE_CONNECTING,0f)

.build());

if (shouldBeEnabled != mShouldBeEnabled) {

getPackageManager().setComponentEnabledSetting(mMediaButtonComponent,shouldBeEnabled

? PackageManager.COMPONENT_ENABLED_STATE_ENABLED

: PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);

}

mShouldBeEnabled = shouldBeEnabled;

}

谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值