Я использую SpeechRecognizer и RecognizerListener в моем приложении SoftKeyboard. Я могу получить результаты от слушателя, но запуск результатов автоматического добавления в InputConnection оказывается проблематичным ... вот код ...
public class SoftKeyboard extends InputMethodService
implements KeyboardView.OnKeyboardActionListener {
private SpeechRecognizer getMsg = SpeechRecognizer.createSpeechRecognizer(this);
public static String mResult = "";
// a bunch of code that is irrelavent to my question
public void getVoice () {
mResult = "";
context = this;
if (isListening == false) {
isListening = true;
Intent intent = new Intent (RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
Talk doMsg = new Talk();
getMsg.setRecognitionListener(doMsg);
getMsg.startListening(intent);
}
}
public void putText () {
getCurrentInputConnection().commitText(mResult, 1);
}
}
class Talk implements RecognitionListener {
Context context = SoftKeyboard.context;
public void onBeginningOfSpeech() {
Toast.makeText(context, "Beginning of Speech", Toast.LENGTH_SHORT).show();
}
public void onBufferReceived(byte[] buffer) {
//Toast.makeText(context, "Buffer received", Toast.LENGTH_SHORT).show();
}
public void onEndOfSpeech() {
Toast.makeText(context, "End Of Speech", Toast.LENGTH_SHORT).show();
}
public void onError(int error) {
// TODO Auto-generated method stub
Toast.makeText(context, "There was an Error: "+String.valueOf(error), Toast.LENGTH_SHORT).show();
SoftKeyboard.isListening = false;
}
public void onEvent(int eventType, Bundle params) {
Toast.makeText(context, "Event: "+String.valueOf(eventType), Toast.LENGTH_SHORT).show();
}
public void onPartialResults(Bundle partialResults) {
Toast.makeText(context, "Partial Results to be had", Toast.LENGTH_SHORT).show();
}
public void onReadyForSpeech(Bundle params) {
Toast.makeText(context, "Ready For Speech!", Toast.LENGTH_SHORT).show();
}
public void onResults(Bundle results) {
ArrayList<String> result = results.getStringArrayList("results_recognition");
if (result.isEmpty() == false) {
for (int i = 0; i<(result.size()-1);i++) {
Toast.makeText(context, result.get(i), Toast.LENGTH_SHORT).show();
}
SoftKeyboard.mResult = result.get(0);
} else {
Toast.makeText(context, "no results", Toast.LENGTH_SHORT).show();
SoftKeyboard.mResult = "-1";
}
SoftKeyboard.isListening = false;
SoftKeyboard.putText();
}
public void onRmsChanged(float rmsdB) {
}
}
поэтому я вызываю метод getVoice нажатием кнопки, и он работает нормально, пока я не вызову метод putText обратно в SoftKeyboard. Я могу вызывать только статический метод из метода onResult, но если я сделаю putText статическим методом, я не могу вызвать getCurrentInputConnection ... единственный найденный мной способ состоит в том, что пользователь нажимает кнопку второй раз, чтобы вставить текст, но это не очень удобно для пользователя. Я хочу вызвать getCurrentInputConnection автоматически после запуска метода onResult в Слушателе, но статический / нестатический конфликт здесь очень проблематичен. Любая помощь будет принята с благодарностью! Спасибо!