Прослушивание ввода кнопки гарнитуры не работает

Из того, что я прочитал из множества других вопросов в Интернете, при прослушивании ввода с кнопки наушников у вас должен быть приемник для действия MEDIA_BUTTON и его регистрация в манифесте.
Мой код, как показано ниже:
(Манифест)

...
    <receiver android:name="listeners.HeadphoneButtonBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
</application>
...

(Получатель)

public class HeadphoneButtonBroadcastReceiver extends BroadcastReceiver {
    static short clickAmount = 0;

    public HeadphoneButtonBroadcastReceiver() {
        super();
    }

    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.d("@@DEBUG", "HeadphoneButtonBroadcastReceiver::onReceive");
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) return;

        KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (keyEvent == null) return;

        if (keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;

        // Doing things here
    }
}

где получатель находится в пакете под названием listeners,

Однако я не могу заставить журнал работать, выполнив это или выполнив некоторые исправления, которые я нашел в Интернете (установите очень высокий приоритет фильтра, попробуйте установить зависимость получателя в коде, а не в манифесте).

Я знаю, что сама кнопка ввода работает, потому что я пытался перезаписать onKeyDown функция в моей деятельности, и она прошла там. Однако я хочу иметь возможность прослушивать щелчок, даже если активность не является текущим окном.
Моя целевая версия SDK - API 25 (7.1.1), если это имеет значение.

1 ответ

Вместо того, чтобы создавать свой собственный приемник вещания, вы можете попробовать приемник вещания, предоставляемый библиотекой поддержки.

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
    <intent-filter>
       <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

Как сказано в документации, MediaButtonReceiver будет выглядеть Service у которого есть android.intent.action.MEDIA_BUTTON Фильтр намерений и обработка ключевого события в сервисе

<service android:name=".MediaPlaybackService">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>

Реализация сервиса

public class MediaPlaybackService extends Service {

    private MediaSessionCompat mediaSessionCompat;
    private static final String TAG = "MediaPlaybackService";

    @Override
    public void onCreate() {
        super.onCreate();
        mediaSessionCompat = new MediaSessionCompat(this, "myMediaSession");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: media button intent");
        MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
Другие вопросы по тегам