源码已经打包上来了,需要的可以看看,里面需要图灵机器人的一个key,百度语音key等,需要自己去申请添加进去,分别在MainActivity类跟HttpUtil里面添加!
在前人图灵机器人的demo基础上添加了语音功能,功能简单,但是有时候还是会用到!
贴一下MainActivity类:
public class MainActivity extends Activity implements SensorEventListener {
/**
* 展示消息的listview
*/
private ListView mChatView;
/**
* 文本域
*/
private EditText mMsg;
/**
* 存储聊天消息
*/
private List<ChatMessage> mDatas = new ArrayList<ChatMessage>();
/**
* 适配器
*/
private ListMessageAdapter mAdapter;
//定义头像
private ImageView chat_from_icon;
private SensorManager mSensorManager;
//启动语音功能
Button video;
//百度语音识别对话框
BaiduASRDigitalDialog mDialog=null;
DialogRecognitionListener mDialogListener=null;
//应用授权信息 ,填入属于自己的key
String API_KEY="XXXXXXXXXXXXXX";
String SECRET_KEY="XXXXXXXXXXXXXX";
//private TextView sendmsg;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
ChatMessage from = (ChatMessage) msg.obj;
mDatas.add(from);
mAdapter.notifyDataSetChanged();
mChatView.setSelection(mDatas.size() - 1);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_chatting);
initView();
mAdapter = new ListMessageAdapter(this, mDatas);
mChatView.setAdapter(mAdapter);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
// sendmsg=(TextView)findViewById(R.id.chat_send_content);
Videos();
}
@Override
protected void onResume() {
super.onResume();
// 加速度传感器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
// 还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,
// 根据不同应用,需要的反应速率不同,具体根据实际情况设定
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onStop() {
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(this);
super.onPause();
}
private void initView() {
mChatView = (ListView) findViewById(R.id.id_chat_listView);
chat_from_icon=(ImageView)findViewById(R.id.chat_from_icon);
mMsg = (EditText) findViewById(R.id.id_chat_msg);
mDatas.add(new ChatMessage(Type.INPUT,
"我是静静,我可是上知天文,下知地理,古今中外样样精通,你什么都可以问我呦~"));
}
public void sendMessage(View view) {
final String msg = mMsg.getText().toString();
if (TextUtils.isEmpty(msg)) {
Toast.makeText(this, "您还没有输入呢,静静看不见的呦~.", 1).show();
return;
}
ChatMessage to = new ChatMessage(Type.OUTPUT, msg);
to.setDate(new Date());
mDatas.add(to);
mAdapter.notifyDataSetChanged();
mChatView.setSelection(mDatas.size() - 1);
mMsg.setText("");
// 关闭软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 得到InputMethodManager的实例
if (imm.isActive()) {
// 如果开启
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_NOT_ALWAYS);
// 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
}
new Thread() {
public void run() {
ChatMessage from = null;
try {
from = HttpUtils.sendMsg(msg);
} catch (Exception e) {
from = new ChatMessage(Type.INPUT, "服务器腿短,跟不上~~~~~");
}
Message message = Message.obtain();
message.obj = from;
mHandler.sendMessage(message);
};
}.start();
}
//晃动手机界面摆动实现
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
int sensorType = event.sensor.getType();
// values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;
if (sensorType == Sensor.TYPE_ACCELEROMETER) {
/*
* 因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机的时候,瞬时加速度才会突然增大或减少。
* 所以,经过实际测试,只需监听任一轴的加速度大于14的时候,改变你需要的设置就OK了~~~
*/
if ((Math.abs(values[0]) > 14 || Math.abs(values[1]) > 14 || Math
.abs(values[2]) > 14)) {
mChatView.startAnimation(AnimationUtils.loadAnimation(this,
R.anim.shake));
mDatas.add(new ChatMessage(Type.INPUT, "不要摇了,静静晕了~"));
mAdapter.notifyDataSetChanged();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
//语音识别方法
private void Videos(){
if (mDialog == null) {
if (mDialog != null) {
mDialog.dismiss();
}
Bundle params = new Bundle();
//设置API_KEY, SECRET_KEY
params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, API_KEY);
params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, SECRET_KEY);
//默认输入模式
params.putInt(BaiduASRDigitalDialog.PARAM_PROP, VoiceRecognitionConfig.PROP_INPUT);
//设置语音识别对话框为蓝色高亮主题
params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, BaiduASRDigitalDialog.THEME_BLUE_LIGHTBG);
//默认语音类型中文普通话
params.putString(BaiduASRDigitalDialog.PARAM_LANGUAGE, VoiceRecognitionConfig.LANGUAGE_CHINESE);
//实例化百度语音识别对话框
mDialog = new BaiduASRDigitalDialog(this, params);
//设置百度语音识别回调接口
mDialogListener=new DialogRecognitionListener()
{
@Override
public void onResults(Bundle mResults)
{
ArrayList<String> rs = mResults != null ? mResults.getStringArrayList(RESULTS_RECOGNITION) : null;
if (rs != null && rs.size() > 0) {
final String msg=rs.get(0);
ChatMessage too = new ChatMessage(Type.OUTPUT, msg);
too.setDate(new Date());
mDatas.add(too);
mAdapter.notifyDataSetChanged();
mChatView.setSelection(mDatas.size() - 1);
new Thread() {
public void run() {
ChatMessage from = null;
try {
from = HttpUtils.sendMsg(msg);
} catch (Exception e) {
from = new ChatMessage(Type.INPUT, "服务器腿短,跟不上~~~~~");
}
Message message = Message.obtain();
message.obj = from;
mHandler.sendMessage(message);
};
}.start();
}
}
};
mDialog.setDialogRecognitionListener(mDialogListener);
}
//禁用语义识别
mDialog.getParams().putBoolean(BaiduASRDigitalDialog.PARAM_NLU_ENABLE, false);
//界面元素
video=(Button)findViewById(R.id.video);
video.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mDialog.show();
}
});
}
}