【问题标题】:Handling MediaButtonEvents in android在android中处理MediaButtonEvents
【发布时间】: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


    【解决方案1】:

    从 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.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);
        at.play();
    
        // a little sleep 
        at.stop();
        at.release();
    

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 2012-12-14
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多