接上文,如何实现语音控制呢?比如当我们说天气的时候,界面会自动呈现的天气预报的界面,当我们说UC的时候,会自动跳转到UC浏览器上等等。其实方法很简单,仅仅需要对识别到的字符串进行判断,当它符合特定的字符串是就对Activity进行跳转,跳转到自己写好的Activity上,或者跳转到已安装的应用上,下面来看具体怎么实现:
首先我们在layout布局里增加一个ToggleButton用于开关语音控制:
然后我们就在获取结果的RecognizerDialogListener下面改变几行代码:
RecognizerDialogListener recoListener = new RecognizerDialogListener() {@Overridepublic void onResults(ArrayList<RecognizerResult> results,boolean isLast) {
//新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别 if (tb.isChecked()) {
//doVoice方法就是进行识别 doVoice(results);} else {// 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项text += results.get(0).text;System.out.println(text);}}
如果进行语言识别就把返回的结果传入上面的doVoice方法里,doVoice如下://首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。
//注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。 private void doVoice(ArrayList<RecognizerResult> results) {Intent i = new Intent();for(RecognizerResult result : results){if(result.text.contains("天气")){//天气界面的跳转i.setClass(Voice1Activity.this, Weather.class);startActivity(i);}else if(result.text.contains("新闻")){//新闻界面的跳转i.setClass(Voice1Activity.this, News.class);startActivity(i);}else if(result.text.contains("短信")){//短信界面的跳转i.setAction(Intent.ACTION_VIEW);i.setType("vnd.android-dir/mms-sms");startActivity(i);}else{//如果没有相应指令就用Toast提示用户Toast.makeText(Voice1Activity.this, "无法识别", Toast.LENGTH_SHORT).show();}}}
如下是做得相应简单界面:
其实在主UI里执行那么耗时操作比如语音的识别与控制并不是很好的方法,其实完全可以把这些耗时的操作交给Service来做只要在主Activity的开始,启动一个Service,定义好各种逻辑接口并把那些耗时的操作交给Service就行了,在Service里面实现语音的识别,控制和逻辑的跳转。
源码地址:http://115.com/file/c2403e81#VoiceContral.rar