【发布时间】:2021-02-10 07:48:41
【问题描述】:
我想在我的 react-native 应用程序中添加一个功能,我应该能够在按下蓝牙耳机上的按钮时触发一个事件。我尝试了一些库,如 react-native-keyevent 等,它们覆盖了 onKeyDown() 函数,但我无法从我的蓝牙设备捕获任何事件,尽管它适用于我的 Wiered 耳机。我还尝试在 MainActivity.class 中覆盖 dispatchKeyEvent() 也没有用。因此,现在我正在尝试研究一些本机替代方案,以后可以将其制成模块并在我的应用程序中使用。我现在正尝试在我的应用程序中使用 MediaSession,但我无法通过耳机捕获任何事件。下面是我的 MediaService:
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, 0, 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();
}
}
我只想在不播放任何音频的情况下处理媒体按钮事件它也不起作用。
<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 react-native android-mediasession