Как получать события воспроизведения/паузы Bluetooth-гарнитуры при TextToSpeech.speak()?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как получать события воспроизведения/паузы Bluetooth-гарнитуры при TextToSpeech.speak()?

Сообщение Anonymous »

Я пытаюсь обработать кнопку паузы/воспроизведения на гарнитуре Bluetooth (например, Jabra Elite 7 Pro), просто вводя в Logcat сообщение при каждом ее нажатии. Изюминка заключается в том, что это происходит во время TextToSpeech.speak(...), а не во время обычного воспроизведения мультимедиа.
Для этого Я внес следующие изменения в код моего приложения (Java):
1. Обновлен build.gradle
Добавлены необходимые зависимости в мой файл build.gradle:

Код: Выделить всё

dependencies {
implementation 'androidx.media:media:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.0'
}
2. Обновлен AndroidManifest.xml
Добавлен MediaButtonReceiver в мой AndroidManifest.xml: и необходимые разрешения Bluetooth: 3. Изменил мою активность

Код: Выделить всё

import android.content.ComponentName;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.session.MediaSession;
import androidx.media.session.MediaButtonReceiver;

import android.content.Intent;
import android.media.session.MediaSession;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
вместе с:

Код: Выделить всё

public class MainActivity extends AppCompatActivity {
private static final String TAG = "BluetoothMediaButton";
private MediaSession mediaSession;
private AudioFocusRequest audioFocusRequest;
private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;

and MediaSession.setCallback(..):

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// etc. ...

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), MediaButtonReceiver.class.getName()));
audioFocusChangeListener = focusChange -> {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
Log.d(TAG, "Audio focus gained");
// Resume playback or increase volume
break;
case AudioManager.AUDIOFOCUS_LOSS:
Log.d(TAG, "Audio focus lost");
// Stop playback
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
Log.d(TAG, "Audio focus lost temporarily");
// Pause playback or lower volume
break;
}
};

Log.d(TAG, "Setting up MediaSession");
mediaSession = new MediaSession(this, "BluetoothMediaButtonExample");
Log.d(TAG, "MediaSession created");
mediaSession.setCallback(new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(@NonNull Intent mediaButtonIntent) {
Log.d(TAG, "onMediaButtonEvent called");
Log.d(TAG, "Media button pressed: " + mediaButtonIntent.getAction());
return super.onMediaButtonEvent(mediaButtonIntent);
}
});
Log.d(TAG, "MediaSession callback set");
mediaSession.setActive(true);
Log.d(TAG, "MediaSession activated");

// etc. ...
}
Примечание: изначально я не вводил никакого кода «фокусировки звука». Но поскольку я не получил ожидаемых событий, я подозревал, что события медиа-кнопки могут быть перехвачены другим приложением, имеющим аудио-фокус.
Поэтому я добавил выше журнал аудио-фокуса, а также код для явного запроса фокусировки звука:

Код: Выделить всё

    private void requestAudioFocus() {
AudioAttributes playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build();

audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(audioFocusChangeListener)
.build();

int result = mAudioManager.requestAudioFocus(audioFocusRequest);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(TAG, "Audio focus request granted");
// Start playback or enable media button handling
} else {
Log.d(TAG, "Audio focus request failed");
}
}

private void abandonAudioFocus() {
if (audioFocusRequest != null) {
mAudioManager.abandonAudioFocusRequest(audioFocusRequest);
Log.d(TAG, "Audio focus abandoned");
}
}
и

Код: Выделить всё

@Override
public void onResume() {
super.onResume();
requestAudioFocus();
}
и

Код: Выделить всё

@Override
public void onPause() {
super.onPause();
abandonAudioFocus();
}
и

Код: Выделить всё

@Override
public void onDestroy() {
super.onDestroy();
if (mediaSession != null)
mediaSession.release();
}
Подтверждено следующими соответствующими сообщениями Logcat (отфильтрованными по «медиа»):

Код: Выделить всё

---------------------------- PROCESS STARTED (31873) for package com.me.myapp ----------------------------
09:50:34.384  MyActivity               D  T=31873 Setting up MediaSession | MyActivity.onCreate(MyActivity.java:892) < MyAppActivity.onCreate(MyAppActivity.java:24)
09:50:34.387                           D  T=31873 MediaSession created | MyActivity.onCreate(MyActivity.java:894) < MyAppActivity.onCreate(MyAppActivity.java:24)
09:50:34.387                           D  T=31873 MediaSession callback set | MyActivity.onCreate(MyActivity.java:903) < MyAppActivity.onCreate(MyAppActivity.java:24)
09:50:34.388                           D  T=31873 MediaSession activated | MyActivity.onCreate(MyActivity.java:905) < MyAppActivity.onCreate(MyAppActivity.java:24)
09:50:36.217 cr_media                  W  BLUETOOTH_CONNECT permission is missing.
09:50:36.218                           W  getBluetoothAdapter() requires BLUETOOTH permission
09:50:36.219                           W  registerBluetoothIntentsIfNeeded: Requires BLUETOOTH permission
---------------------------- PROCESS ENDED (31873) for package com.me.myapp ----------------------------
и (отфильтровано по «аудио»):

Код: Выделить всё

---------------------------- PROCESS STARTED (31873) for package com.me.myapp ----------------------------
09:50:34.698  MyActivity               D  T=31873 Audio focus request granted | MyActivity.requestAudioFocus(MyActivity.java:988) < MyActivity.onResume(MyActivity.java:1099)
09:50:34.800                           D  T=31873 Audio focus abandoned | MyActivity.abandonAudioFocus(MyActivity.java:998) < MyActivity.onPause(MyActivity.java:1651)
09:50:36.239                           D  T=31873 Audio focus request granted | MyActivity.requestAudioFocus(MyActivity.java:988) <  MyActivity.onResume(MyActivity.java:1099)
---------------------------- PROCESS ENDED (31873) for package com.me.myapp ----------------------------
Тем не менее, несмотря на явный запрос на фокусировку звука, мне не удалось увидеть в Logcat желаемый "onMediaButtonEvent call" сообщение.
После долгих исследований я обнаружил, что существует задокументированная «ошибка», которая не позволяет получать события медиа-кнопок для TTS: https://issuetracker.google.com/issues/249741615
p>
В настоящее время единственным обходным решением является "Я только что воспроизводил тихий звук менее 1 секунды с помощью класса MediaPlayer, а когда закончил, я начинаю использовать TextToSpeech".К сожалению, этот обходной путь не подходит для моего приложения, поэтому я ищу дополнительные идеи для получения событий воспроизведения/паузы Bluetooth-гарнитуры при TextToSpeech.speak(...).
Есть ли способ преодолеть этот фокус на звуке (для TTS), который не требует воспроизведения 1-секундного файла .wav перед каждым вызовом()?

Подробнее здесь: https://stackoverflow.com/questions/789 ... eech-speak
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разница между TextToSpeech.addEarcon() и TextToSpeech.addSpeech()
    Anonymous » » в форуме Android
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Разница между TextToSpeech.addEarcon() и TextToSpeech.addSpeech()
    Anonymous » » в форуме Android
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Разница между TextToSpeech.addEarcon() и TextToSpeech.addSpeech()
    Anonymous » » в форуме Android
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Разница между TextToSpeech.addEarcon() и TextToSpeech.addSpeech()
    Anonymous » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Разница между TextToSpeech.addEarcon() и TextToSpeech.addSpeech()
    Anonymous » » в форуме Android
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»