Как обращаться с 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 является то, что вы не остановили службу распознавания из основного потока, и ошибка была проигнорирована.