如何解决在android中处理MediaButtonEvents
我想要在我的 react-native 应用程序中使用一个功能,在该功能中我应该能够在按下蓝牙耳机上的按钮时触发一个事件。我尝试了一些库,如 react-native-keyevent 等,它们覆盖了 onKeyDown() 函数,但我无法从我的蓝牙设备捕获任何事件,尽管它适用于我的有线耳机。我还尝试在 MainActivity.class 中覆盖 dispatchKeyEvent() 也没有工作。所以现在我正在尝试寻找一些本地替代方案,我以后可以将其制作成一个模块并在我的应用程序中使用。我现在正在尝试在我的应用程序中使用 MediaSession,但我无法通过耳机捕获任何事件。下面是我的媒体服务:
import android.app.Service;
import android.content.Intent;
import android.media.browse.Mediabrowser;
import android.media.session.MediaSession;
import android.media.session.PlaybackState;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.service.media.MediabrowserService;
import android.support.v4.media.session.IMediaSession;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
import android.util.Log;
import android.view.KeyEvent;
import androidx.media.session.MediaButtonReceiver;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.util.List;
public class MediaService extends Service {
private MediaSessionCompat session;
@Override
public void onCreate() {
Log.d("MediaService","onCreate");
session = new MediaSessionCompat(this,"Session");
Log.d("MediaSession","" + session);
session.setCallback(new MediaSessionCompat.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
String action = mediaButtonIntent.getAction();
Log.d("MediaSession","Intent Action" + action);
if (Intent.ACTION_MEDIA_BUTTON.equals(mediaButtonIntent.getAction())) {
KeyEvent event = (KeyEvent) mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
Log.d("MediaSession","KeyCode" + event.getKeyCode());
return true;
}
return super.onMediaButtonEvent(mediaButtonIntent);
}
@Override
public void onPlay() {
Log.d("MediaSession","onPlay" );
super.onPlay();
}
@Override
public void onPause() {
Log.d("MediaSession","onPause" );
super.onPlay();
}
});
PlaybackStateCompat state = new PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_STOP | PlaybackStateCompat.ACTION_SKIP_TO_PREVIoUS)
.setState(PlaybackStateCompat.STATE_PLAYING,0)
.build();
session.setPlaybackState(state);
session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);
session.setActive(true);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
Log.d("MediaService","onStartCommand");
MediaButtonReceiver.handleIntent(session,intent);
return super.onStartCommand(intent,flags,startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
session.release();
super.onDestroy();
}
}
我只想在不播放任何音频的情况下处理媒体按钮事件我不知道我在这里做错了什么但是每次我尝试按下媒体按钮时我的最后一个音频活动(通常是 spotify)开始播放我也尝试过 android:priority它也不起作用。
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="androidx.media.session.MediaButtonReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
<service android:name=".MediaService" android:enabled="true" android:exported="true" android:permission="android.permission.FOREGROUND_SERVICE">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</service>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
如果有人能告诉我我做错了什么或者更适合我正在尝试的替代方案,我将不胜感激。
解决方法
从 Android 8.0 开始,除非播放音频,否则您无法收到媒体按钮。 只需在 Walk Around 中播放虚拟音频即可。
How register Broadcast Receiver for media button in Oreo?
- 我之前的问题
// play dummy audio
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC,48000,AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT,AudioTrack.getMinBufferSize(48000,AudioFormat.ENCODING_PCM_16BIT),AudioTrack.MODE_STREAM);
at.play();
// a little sleep
at.stop();
at.release();
它实际上并没有播放声音,它只是改变了状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。