Ли RecognitionListener.onError() автоматически SpeechRecognizer.cancel()?

По различным причинам мне нужно использовать raw SpeechRecognizer API вместо более простого RecognizerIntent (RECOGNIZE_SPEECH) действия.

Это означает, среди прочего, что я должен сам обрабатывать RecognitionListener.onError().

В ответ на некоторые из ошибок я просто хочу возобновить прослушивание. Это выглядит просто, но когда я просто вызываю SpeechRecognizer.startListening() при ошибке, иногда это вызывает две разные ошибки:

 ERROR/ServerConnectorImpl(619): Previous session not destroyed

и

"concurrent startListening received - ignoring this call"

Какие намеки, что я должен был выполнить некоторую очистку, прежде чем пытаться снова вызвать SpeechRecognizer.startListening().

Если это правда, это означает, что при ошибке RecognitionListener прослушивание не прекращается автоматически и/или отменяется.

Также возможно, что некоторые ошибки останавливают/отменяют прослушивание, а другие - нет. На самом деле существует только 9 SpeechRecognizer ошибок:

  • ERROR_NETWORK_TIMEOUT
  • ERROR_NETWORK
  • ERROR_AUDIO
  • ERROR_SERVER
  • ERROR_CLIENT
  • ERROR_SPEECH_TIMEOUT
  • ERROR_NO_MATCH
  • ERROR_RECOGNIZER_BUSY
  • ERROR_INSUFFICIENT_PERMISSIONS

Поскольку документация не очень подробно описывает, какая ошибка отменяет прослушивание, а какая нет, знаете ли вы, основываясь на своем опыте, какие ошибки требуют очистки (и в какой степени), прежде чем повторять попытку SpeechRecognizer.startListening()

Ответ 1

Нет, cancel не вызывается при вызове onError. Вы можете посмотреть источник здесь.

Ответ 2

вы можете уничтожить текущий сеанс командой destroy(). И вы можете снова перезапустить его.

Ответ 3

Фактически Femi, некоторые из условий ошибки DO останавливают прослушивание службы транскрипции (например, SpeechRecognizer.ERROR_SPEECH_TIMEOUT). Нет необходимости называть destroy, просто запускать снова.