Как обращаться с ERROR_RECOGNIZER_BUSY

В моем приложении, основанном на распознавании голоса, я иногда получаю ERROR_RECOGNIZER_BUSY. Интуитивно это требует... повторяет, правильно?

Проблема в том, что эта ошибка очень недокументирована, поэтому, очевидно, у меня есть вопросы, которые, возможно, кто-то более опытный в этой области может ответить:

  • Что вызывает такую ​​ошибку? Это действительно только занятый сервер (в Google)? или это может также намекнуть на ошибку в моем приложении?
  • Должен ли я явно закрывать/открывать сеанс перед повторной попыткой?
  • Как часто повторять? один раз каждый 1 секунда? каждые 5 секунд? Другое?

Ваши опытные идеи очень приветствуются. Спасибо.

Ответ 1

Я не уверен на 100%, но так как вы так долго не отправляли сообщения, я также могу сделать это. Кажется, что вы делаете что-то неправильно в коде. Как сказал комментатор, было бы полезно, если бы вы отправили код, возвращающий эту ошибку. Однако в исходном коде для службы распознавания речи Android, найденной здесь:

http://source-android.frandroid.com/frameworks/base/core/java/android/speech/RecognitionService.java у нас есть функция под названием dispatchStopListening, которая, похоже, заканчивает процесс прослушивания. Однако до того, как это действительно закончится, есть несколько проверок незаконных состояний, в том числе:

else if (mCurrentCallback.mListener.asBinder() != listener.asBinder()) {
            listener.onError(SpeechRecognizer.ERROR_RECOGNIZER_BUSY);
            Log.w(TAG, "stopListening called by other caller than startListening - ignoring");
        }

Это, по-видимому, означает, что вы пытаетесь закончить процесс прослушивания каким-то другим парнем, чем вы его начали, что вызывает эту ошибку. Я надеюсь, что это поможет, но было бы очень полезно, если бы вы разместили код.

Ответ 2

ERROR_RECOGNIZER_BUSY часто вызывается, когда вы уже используете объект SpeechRecognizer. (Или вы не закрыли один прорелли).

Ответ 3

Просто добавьте пакет в намерение распознавателя, и он должен работать. Это то, что я сделал.

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
...
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.package.name");

Ответ 4

Наиболее вероятной причиной для ERROR_RECOGNIZER_BUSY является то, что вы не остановили службу распознавания из основного потока, и ошибка была проигнорирована.