接上文,如何实现语音控制呢?比如当我们说天气的时候,界面会自动呈现的天气预报的界面,当我们说UC的时候,会自动跳转到UC浏览器上等等。其实方法很简单,仅仅需要对识别到的字符串进行判断,当它符合特定的字符串是就对Activity进行跳转,跳转到自己写好的Activity上,或者跳转到已安装的应用上,下面来看具体怎么实现:
首先我们在layout布局里增加一个ToggleButton用于开关语音控制:

然后我们就在获取结果的RecognizerDialogListener下面改变几行代码:
[java]  view plain copy
  1. RecognizerDialogListener recoListener = new RecognizerDialogListener() {  
  2.   
  3.         @Override  
  4.         public void onResults(ArrayList<RecognizerResult> results,  
  5.                 boolean isLast) {  
  6. //新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别              
  7.             if (tb.isChecked()) {  
  8. //doVoice方法就是进行识别                 
  9.                 doVoice(results);  
  10.             } else {  
  11.                 // 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项  
  12.                 text += results.get(0).text;  
  13.                 System.out.println(text);  
  14.             }  
  15.   
  16.         }  
如果进行语言识别就把返回的结果传入上面的doVoice方法里,doVoice如下:
[java]  view plain copy
  1. //首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。  
  2. //注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。          
  3.         private void doVoice(ArrayList<RecognizerResult> results) {  
  4.             Intent i = new Intent();  
  5.             for(RecognizerResult result : results){  
  6.                 if(result.text.contains("天气")){  
  7.                     //天气界面的跳转  
  8.                     i.setClass(Voice1Activity.this, Weather.class);  
  9.                     startActivity(i);  
  10.                 }else if(result.text.contains("新闻")){  
  11.                     //新闻界面的跳转  
  12.                     i.setClass(Voice1Activity.this, News.class);  
  13.                     startActivity(i);  
  14.                 }else if(result.text.contains("短信")){  
  15.                     //短信界面的跳转  
  16.                     i.setAction(Intent.ACTION_VIEW);  
  17.                     i.setType("vnd.android-dir/mms-sms");  
  18.                     startActivity(i);  
  19.                 }else{  
  20.                     //如果没有相应指令就用Toast提示用户  
  21.                     Toast.makeText(Voice1Activity.this"无法识别", Toast.LENGTH_SHORT).show();  
  22.                 }  
  23.             }  
  24.               
  25.         }  
如下是做得相应简单界面:


其实在主UI里执行那么耗时操作比如语音的识别与控制并不是很好的方法,其实完全可以把这些耗时的操作交给Service来做只要在主Activity的开始,启动一个Service,定义好各种逻辑接口并把那些耗时的操作交给Service就行了,在Service里面实现语音的识别,控制和逻辑的跳转。

源码地址:http://115.com/file/c2403e81#VoiceContral.rar

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐