Прослушивание ввода кнопки гарнитуры не работает
Из того, что я прочитал из множества других вопросов в Интернете, при прослушивании ввода с кнопки наушников у вас должен быть приемник для действия 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;
}
}