Как обработать событие медиа-кнопки какой-то конкретной гарнитуры Bluetooth
Я реализую службу мультимедийных кнопок для обработки событий мультимедийных кнопок гарнитур (Bluetooth или проводных), для некоторых конкретных гарнитур (например, BOSE QC35, APPLE airpods) служба не может обнаружить кнопку события для первого щелчка, но может обнаружить его следующий клик.
Например:
скажем, я хочу завершить интернет-вызов после нажатия кнопки мультимедиа на BOSE QC35/AirPods, после завершения нажатия кнопки мультимедиа вызов не прекратится, вместо этого вызов был перенаправлен на телефон (на QC35 я также слышу голос "звонок окончен") в точке), и когда я снова нажму кнопку мультимедиа, вызов закончится.
Для той же реализации, если я использую Monster powerbeats2 или любые проводные наушники, вызов закончится после первого щелчка
Вот код:
public class SampleMediaButtonService extends MediaBrowserServiceCompat {
private MediaSessionCompat mSession;
private static final int POSITION = 0;
private static final float PLAYBACK_SPEED = 1f;
@Override
public void onCreate() {
super.onCreate();
initMediaSessions();
}
@Nullable
@Override
public BrowserRoot onGetRoot(@NonNull final String clientPackageName, final int clientUid,
@Nullable final Bundle rootHints) {
return null;
}
@Override
public void onLoadChildren(@NonNull final String parentId,
@NonNull final Result<List<MediaBrowserCompat.MediaItem>> result) {
}
private void initMediaSessions() {
mSession = new MediaSessionCompat(getApplicationContext(),
MediaButtonService.class.getSimpleName());
mSession.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);
setSessionToken(mSession.getSessionToken());
mSession.setCallback(
new MediaSessionCompat.Callback() {
@Override
public void onPlay() {
LOG.i("Handling media button click");
if (//CALL IS ACTIVE) {
//END the call
}
}
}
);
/* Keeping the initial state as STATE_PAUSED. This will ensure when button is clicked
* onPlay() is called.
*/
long actions = PlaybackStateCompat.ACTION_PLAY;
PlaybackStateCompat playbackStateCompat = new PlaybackStateCompat.Builder()
.setActions(actions)
.setState(PlaybackStateCompat.STATE_PAUSED, POSITION, PLAYBACK_SPEED)
.build();
mSession.setPlaybackState(playbackStateCompat);
mSession.setActive(true);
}
@Override
public int onStartCommand(final Intent startIntent, final int flags, final int startId) {
if (startIntent != null) {
// Try to handle the intent as a media button event wrapped by MediaButtonReceiver
MediaButtonReceiver.handleIntent(mSession, startIntent);
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
mSession.release();
}
}