У меня есть полностью функциональная пользовательская клавиатура для Android, в которой я должен добавить распознавание речи. Вот соответствующие части реализации у меня естьПользовательская клавиатура Android с SpeechRecognizer
public class CustomInputMethodService
extends InputMethodService
implements <random stuff> {
private SpeechRecognizer mSpeechRecognizer;
private RecognitionListener mSpeechlistener;
public void onCreate() {
super.onCreate();
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
mSpeechlistener = new CustomRecognitionListener();
mSpeechRecognizer.setRecognitionListener(mSpeechlistener);
}
@Override
public void onPress(int primaryCode) {
if (primaryCode == KeyCodes.VOICE_INPUT) {
mSpeechRecognizer.startListening(getSpeechIntent());
}else if(..){
...
}
}
private Intent getSpeechIntent() {
Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
speechIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
speechIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);
return speechIntent;
}
}
Соответствующий метод CustomRecognitionListener просто:
@Override
public void onResults(Bundle results) {
ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
Log.d(TAG, "onResults: ----> " + matches.get(0));
if(matches != null && matches.size() > 0) {
writeText(matches.get(0));
}
}
Этот код работает нормально. Поворот в том, что я хочу, подобное поведение к тому, что происходит на Google клавиатуре, когда УСЭТ вводит ключ микрофона:
Это в идеале достигнуто что-то вроде:
Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
try {
startActivityForResult(voiceIntent, Constants.RESULT_SPEECH);
} catch (ActivityNotFoundException ex) {
DebugLog.e(TAG, "Not found excpetion onKeyDown: " + ex);
}
Однако , так как прослушиватель клавиш включен, а InputMethodService im не может вызвать startActivityForResult. Каков идеальный способ достичь этого? Должен ли я просто запускать новое действие без макета и иметь обратный вызов для inputMethodService? кажется беспорядочным
Вы смотрели на LatinIME клавиатуре Google, чтобы посмотрите, как это происходит? Мне было слишком много лет, чтобы я помнил, как, но мы просто скопировали это, когда мы сделали это для Swype. –
Спасибо. Я проверил LatinIME и im фактически использовал неправильный подход. Я отправлю ответ через секунду. – Adr3nl