【问题标题】:Android-TV speech recognition with manual input手动输入的 Android-TV 语音识别
【发布时间】:2015-09-29 11:51:32
【问题描述】:

我已使用以下小代码在我的 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);
}

这一切都很好,我将结果返回以进行进一步处理。

问题是我还想让用户可以使用虚拟键盘手动输入搜索字符串。 在 Google 自己的应用程序中,您只需在按下语音搜索图标后按遥控器上的 RIGHT 即可将焦点放在文本框上。

在上面的示例中,当我按下搜索图标时,我可以看到“内置文本框”,但如果我尝试导航到它,搜索就会中断并关闭。

如何访问搜索文本框?这应该取消语音输入并调出键盘,就像 Play Store 应用一样。

【问题讨论】:

    标签: android speech-recognition voice-recognition android-tv


    【解决方案1】:

    您是否在为您的 Android TV 应用设计使用 Leanback 支持库? 我猜“Google Play 商店应用”和“YouTube 应用”正在使用 BrowseFragment 和 SearchFragment 进行搜索。这些片段提供了内置的搜索 UI。

    有关实现,请参阅Google's sample source codeSearchFragment – Android TV app Tutorial 12

    【讨论】:

    • 感谢您提供的链接,这些链接至少在某种程度上可以正常工作。第一次搜索工作正常,但第二次尝试(不离开搜索片段)然后 onQueryTextSubmit 似乎没有触发,我仍然得到第一次搜索的结果。
    • 你的 SearchFragment 实现了 SearchResultProvider 接口?首先,您可以通过插入 Logcat 日志来检查 onQueryTextChange 和 onQueryTextSubmit 回调是否工作。
    • 是的,它实现了 SearchResultProvider。经过一些调试,我发现只有在您第一次按下虚拟键盘上的搜索按钮时才会调用 onQueryTextSubmit。从同一个搜索片段中再次搜索只会触发 onQueryTextChange。 Google 自己的示例代码中的结果相同,因此这可能是设计使然。我最终实现了 onQueryTextChange 并延迟解决它。
    • 当我测试谷歌的例子时,当我按下软件键盘按钮的“搜索”时,onQueryTextSubmit 工作正常。被测设备是软件版本 5.1.1(API 级别 22)。