概述
这次做的应用需要取Json值(用GSON)和语音合成(SpeechSynthesize),开始测试时用了两个Acticity,一个取值,一个输出。中间用“public static String content;”调用就可以实现,不过在实际开发中,同一Activity中实现虽然容易,但个人觉得这样的代码很乱,所以写了两个工具类,其中一个涉及到了KJFrameForAndroid框架中的取Json值得异步方法。代码如下:
GetTicketInfo.java
kjHttp.urlGet("http://apis.juhe.cn/train/s", params, new StringCallBack() {
@Override
public void onSuccess(String arg0) {
pDialog.dismiss();//progressdialog.dismiss
// System.out.println("arg0=" + arg0);
Gson gson = new Gson();
TicketDTO ticketInfo = gson.fromJson(arg0, TicketDTO.class);
returnStr = ticketInfo.getResultdto().getStation_list().get(0).getStation_name();
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
// TODO Auto-generated method stub
pDialog.dismiss();//progressdialog.dismiss
System.out.println("网络加载失败,请您检查网络");
}
});
取值之后,需要调用SpeechSynthesize工具类来合成语音,代码如下:
public void Speech(Context context,String content) {
// 1.创建 SpeechSynthesizer 对象
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(context, null);
// 2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置发音人
mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100
// 设置合成音频保存位置(可自定义保存位置) ,保存在“./sdcard/iflytek.pcm”
// 如果不需要保存合成音频,注释该行代码
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
// 3.开始合成
dialog=new ProgressDialog(context);
dialog.show();
mTts.startSpeaking("测试文本"+content, mSynListener);
// System.out.println(TempDatas.speech);
}
"GetTicketInfo.java"的返回值为"String str;"
就在MainActivity中:
GetTicketInfo getTicketInfo =new GetTicketInfo(MainActivity.this);
String returnStr=GetTicketInfo.Str;
new SpeechSynthesizeUtility().Speech(MainActivity.this, returnStr);
这种写法SpeechSynthesize是取到的值为"null";
经过各种写法和妄加判定之后,皆为"null",想要实现,却要改工具类?要改代码才能实现的功能的工具类,那还写什么。
那么问题来了,实现办法到底哪家强?我们来写个监听,在”GetTicketInfo.java“中加自定义,监听代码如下:
GetInfoListener getInfoListener;
public void setGetInfoListener(GetInfoListener h) {
this.getInfoListener = h;
}
public void onSuccess(String arg0) {//
pDialog.dismiss();
Gson gson = new Gson();
TicketDTO ticketInfo = gson.fromJson(arg0, TicketDTO.class);
returnStr = ticketInfo.getResultdto().getStation_list().get(0).getStation_name();
getInfoListener.onGet(returnStr);//重点在这 , 只有这里取到值 才能继续执行
}
public interface GetInfoListener {
public abstract void onGet(String returnStr);
}
这样就可以在MainActivty中set监听了,代码如下 :
GetTicketInfo getTicketInfo = new GetTicketInfo(MainActivity.this);
getTicketInfo.setGetInfoListener(new GetTicketInfo.GetInfoListener() {
@Override
public void onGet(String returnStr) {
new SpeechSynthesizeUtility().Speech(MainActivity.this, returnStr);
}
});
getTicketInfo.getTicketInfo("g4");
这样问题迎刃而解
@author:JRwestbrook(zby)
QQ:990021331
支持原创,尊重原创,转载请注明出处