0

Я реализация голосового поиска на моем Android-TV приложении, используя следующий небольшой кодAndroid-TV распознавание речи с ручным вводом

private void displaySpeechRecognizer() { 
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    startActivityForResult(intent, SPEECH_REQUEST_CODE); 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, 
           Intent data) { 
    if (requestCode == SPEECH_REQUEST_CODE && resultCode == -1) { 
     List<String> results = data.getStringArrayListExtra(
       RecognizerIntent.EXTRA_RESULTS); 
     String spokenText = results.get(0); 
     Toast.makeText(getActivity(), spokenText, Toast.LENGTH_LONG).show(); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

Это все работает хорошо, и я получаю результат обратно для дальнейшей обработки ,

Проблема в том, что я также хочу дать пользователю возможность ввести строку поиска вручную с помощью виртуальной клавиатуры. В своих приложениях Googles вы просто нажимаете RIGHT на пульте дистанционного управления, чтобы придать фокус текстовому полю после нажатия на значок голосового поиска.

В моем примере выше я вижу «встроенный текстовый блок», когда я нажимаю значок поиска, но если я попытаюсь перейти к нему, поиск прерывается и закрывается.

Как получить доступ к текстовому поле поиска? Это должно отменить голосовой ввод и вызвать клавиатуру вместо этого, как и приложение Play Store.

ответ

2

Вы используете библиотеку поддержки Leanback для вашего Android-приложения? Я думаю, что «приложение Google Play Store» и «приложение YouTube» используют BrowseFragment & SearchFragment для поиска. Эти фрагменты предоставляют встроенный пользовательский интерфейс поиска.

Для осуществления см. Google's sample source code или SearchFragment – Android TV app Tutorial 12.

+0

Спасибо за ссылки, те получили его работу, по крайней мере, в некоторой степени. Первый поиск работает нормально, но во второй попытке (не выходя из поискового фрагмента), то onQueryTextSubmit, похоже, не срабатывает, я по-прежнему остаюсь с результатами первого поиска. –

+0

Ваш поискFragment реализует интерфейс SearchResultProvider? Сначала вы можете проверить onQueryTextChange & onQueryTextSubmit обратный вызов работает или нет, вставив журнал Logcat. – corochann

+0

Да, он реализует SearchResultProvider. После некоторой отладки я обнаружил, что onQueryTextSubmit вызывается только в первый раз, когда вы нажимаете кнопку поиска на виртуальной клавиатуре. При повторном поиске из одного и того же поискового фрагмента только триггеры onQueryTextChange. Тот же результат в собственном примере кода Google, поэтому это может быть по дизайну. Я закончил реализацию onQueryTextChange с задержкой, чтобы обойти его. –

Смежные вопросы