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

然后我们就在获取结果的RecognizerDialogListener下面改变几行代码:
RecognizerDialogListener recoListener = new RecognizerDialogListener() {
@Override
public 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