在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();

它实际上并没有播放声音,它只是改变了状态。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...