前言

在现有的软件的搜索框中基本上都会加上语音搜索的图标,以方便用户输入.我们xxxx的搜索框其实也可以借鉴这样的输入方式,提高用户体验.
语音识别有3种方式实现①使用intent调用语音识别程序;②通过sevice的方式实现;③选用接入第3方语音识别库;
下面就这一方案技术①,③实现进行描述.

1.  使用intent调用语音识别程序

Android系统已经为我们提供了通过intent的方式来启动,在代码中只发出一个”android.speech.action.RECOGNIZE_SPEECH”的intent,就可以调用到系统中已经安装好的语音识别软件.我们只要获取返回值并显示即可.调用代码如下:
  Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.hint_code));
startActivityForResult(intent, REQUEST_CODE_RECOGNITION_REQUEST);
 
当然,如果用户的机子没有安装相关的软件,就会报错,所以我们还需要做如下的处理之一.
1.为上面的代码段添加异常捕获并提示;
2.在调用之前判断下时候用户的机子已经安装了相关的软件,没有则把语音输入的按钮隐藏或者不可操作,判断的代码如下:
    public static boolean isApkInstalled(String strIntent){
       PackageManager packageManager = context.getPackageManager();
      List<ResolveInfo> activities = packageManager.queryIntentActivities(new Intent(strIntent), 0);
      
       return activities != null && !activities.isEmpty();
    }
在调用之后在onActivityResult()里添加对语音输入返回的值的过滤.例如在intent中就存在结果集data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);下面示例就是显示输入结果让用户选择正确的输入值,这里是弹出对话框的方式.
        if(requestCode == REQUEST_CODE_RECOGNITION_REQUEST && resultCode == RESULT_OK) {
            ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
           
            if(results!=null && !results.isEmpty()){
              int size=results.size();
              audioArray=new String[size];
              results.toArray(audioArray);
             
              for(int i=0; i<size;i++){
                 String str=results.get(i);
                 if(str!=null){
                     str.replaceAll(" ", "");
                     str.replaceAll(" ", "");
                 }
                
                 audioArray[i]=str;
              }
             
              showDialog(DIALOG_AUDIO);
            }else{
              Toast.makeText(this, R.string.hite_audio, Toast.LENGTH_SHORT).show();
            }
        }

2.  选用接入第3方语音识别库

上面那种是依赖于用户自己已经安装了语音输入的方式,但如果用户机子上没有的话,可以用过提示用户安装.其实更好的方式是采用接入第2,3方的语音输入来实现更可靠些. 下面介绍选用科大讯飞的语音识别库.
科大讯飞语音识别库中主要是用到RecognizerDialog,他是继承与Dialog,所以只要用过showDialog()的方式即可直接显示其输入界面.createDialog代码如下:
       RecognizerDialog recognizerDialog = new RecognizerDialog(MainActivity.this, "appid=1234567");
       // appid应该写从科大讯飞申请到的appid      recognizerDialog.setEngine("sms", null, null);//”sms”:普通文本转写       recognizerDialog.setListener(new RecognizerDialogListener() {
           @Override
           public void onResults(ArrayList<RecognizerResult> results,
                  boolean arg1) {
              StringBuffer result = new StringBuffer();
              for (RecognizerResult r : results) {
                  result.append(r.text);
              }
              editText.setText(result.toString());
           }
 
           @Override
           public void onEnd(SpeechError arg0) {
 
           }
    });

Android语音搜索的更多相关文章

  1. 将语音搜索集成到Google Now中

    原文标题:Use Voice Search to integrate with Google Now 原文链接:http://antonioleiva.com/voice_search_google_ ...

  2. Android语音播报、后台播报、语音识别

    Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...

  3. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  4. android浮动搜索框

    android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件​,新建文件searchable.xml,保存在res/xml ...

  5. 淘宝语音搜索的实现——html5

    作为一个专业的淘宝控,不知道从什么时候开始发现淘宝上居然还有语音搜索,好吧,因为好奇心作祟还是想一探究竟.不过我想仔细一点的人,都会发现在只有在webkit内核的浏览器上有,原因是它只支持webkit ...

  6. Android 系统搜索框(有浏览记录)

    实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件  要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...

  7. 实时Android语音对讲系统架构

    本文属于Android局域网内的语音对讲项目系列,<通过UDP广播实现Android局域网Peer Discovering>实现了局域网内的广播及多播通信,本文将重点说明系统架构,音频信号 ...

  8. 改进Android语音对讲系统的方法

    本文属于Android局域网内的语音对讲项目系列,<实时Android语音对讲系统架构>阐述了局域网内Android语音对讲功能的框架,本文在此基础上进行了优化,包括音频的录制.播放,通信 ...

  9. ---- 关于Android蓝牙搜索到设备的图标显示和设备过滤

    根据: https://www.douban.com/note/637446089/http://bbs.16rd.com/blog-23795-3446.html 以下摘自原文: (Android主 ...

随机推荐

  1. 让pre标签自动换行示例代码

    pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre> 标签的一个常见应用就是用来表示计算机的源代码.对于技术博客经 ...

  2. 使用Thrift RPC编写程序(服务端和客户端)

    1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processo ...

  3. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  4. jquery让一个点击事件刷新页面就自己执行一次的方法

    $('name')这个元素之前已经绑定过事件啦,(on绑定)然后直接调用下即可: $('name').click();

  5. 第三百三十八天 how can I 坚持

    下午去奥体森林公园跑了个步,好累. 晚上和徐斌同学一起吃了个饭,接触了下杨辉三角,还没整明白,明天看下. 突然想起java 编译,ant脚本. 要精通门技术,还要赶上潮流. 睡觉.

  6. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  7. MYSQL数据库性能调优之六:备份

    增量备份

  8. C#下载http文件

    @(编程) using System; using System.IO; using System.Net; namespace Wisdombud.Util { public class HttpH ...

  9. mysql show processlist 命令详解

    命令格式 SHOW [FULL] PROCESSLIST SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此信息.如果您有SUPE ...

  10. [置顶] 我的设计模式学习笔记------>Java设计模式总概况

    设计模式的概念最早起源于建筑设计大师Alexander的<建筑的永恒方法>一书,尽管Alexander的著作是针对建筑领域的,但是他的观点实际上用用于所有的工程设计领域,其中也包括软件设计 ...