Я пытаюсь использовать Speech Recognizer в моем проекте.Я использую этот учебник в качестве примера.
ссылка Все отлично работает, когда я использую кнопку, чтобы начать прослушивание.
binding.toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
binding.progressSound.setVisibility(View.VISIBLE);
binding.progressSound.setIndeterminate(true);
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_RECORD_PERMISSION);
} else {
binding.progressSound.setIndeterminate(false);
binding.progressSound.setVisibility(View.INVISIBLE);
speech.stopListening();
}
}
});
Метод SpeechRecognizer.startListening переопределяет onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_RECORD_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//===start listening
speech.startListening(recognizerIntent);
} else {
Toast.makeText(getContext(), "Permission Denied!", Toast
.LENGTH_SHORT).show();
}
}
}
Но когда я запускаю распознаватель после воспроизведения звука, он не работает.
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp)
{
Log.i(TAG, "endOfSound");
binding.toggleButton.performClick();
}
Когда я пытался решить эту проблему с помощью задержки, она работает.
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 5s = 5000ms
binding.toggleButton.performClick();
}
}, 5000);
Но это плохое решение, потому что длина звуков различна.