Для этого Я внес следующие изменения в код моего приложения (Java):
1. Обновлен build.gradle
Добавлены необходимые зависимости в мой файл build.gradle:
Код: Выделить всё
dependencies {
implementation 'androidx.media:media:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.0'
}
Добавлен MediaButtonReceiver в мой AndroidManifest.xml:
Код: Выделить всё
Код: Выделить всё
Код: Выделить всё
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();
}
Код: Выделить всё
---------------------------- 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 ----------------------------
После долгих исследований я обнаружил, что существует задокументированная «ошибка», которая не позволяет получать события медиа-кнопок для TTS: https://issuetracker.google.com/issues/249741615
p>
В настоящее время единственным обходным решением является "Я только что воспроизводил тихий звук менее 1 секунды с помощью класса MediaPlayer, а когда закончил, я начинаю использовать TextToSpeech".К сожалению, этот обходной путь не подходит для моего приложения, поэтому я ищу дополнительные идеи для получения событий воспроизведения/паузы Bluetooth-гарнитуры при TextToSpeech.speak(...).
Есть ли способ преодолеть этот фокус на звуке (для TTS), который не требует воспроизведения 1-секундного файла .wav перед каждым вызовом()?
Подробнее здесь: https://stackoverflow.com/questions/789 ... eech-speak