package com.atguigu.voicedialog; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.iflytek.cloud.RecognizerResult; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.ui.RecognizerDialogListener; import java.util.ArrayList; import java.util.List; import java.util.Random; public class MainActivity extends Activity implements View.OnClickListener { private SpeechUtils mSpeechUtils; private List<ConversationInfo> conversationList; private MyAdapter mAdapter; private ListView mListView; private Button btnStartListen; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); mSpeechUtils = SpeechUtils.getInstance(this); } private void initView() { setContentView(R.layout.activity_main); mListView = (ListView) findViewById(R.id.lv_conversation); btnStartListen = (Button) findViewById(R.id.btn_start_listen); btnStartListen.setOnClickListener(this); conversationList = new ArrayList<>(); mAdapter = new MyAdapter(); mListView.setAdapter(mAdapter); } @Override public void onClick(View v) { mSpeechUtils.showListenVoiceDialog(this, new MyRecognizerDialogListener()); } class MyRecognizerDialogListener implements RecognizerDialogListener{ StringBuffer sb = new StringBuffer(); @Override public void onResult(RecognizerResult recognizerResult, boolean isLast) { //语音识别过来的内容 String resultString = recognizerResult.getResultString(); sb.append(getVoice(resultString));//添加成一整句 System.out.println("正在识别中: " + sb.toString()); String askerText = "你说什么,我没听见..."; String answer; int imageID = -1; if (isLast) { // true, 所有的数据都解析完闭. 赋值给askerText askerText = sb.toString(); answer = sb.toString(); if (askerText.contains("美女")) { Random random = new Random(); int index = random.nextInt(3); answer = ResouesUtils.mmTextArray[index]; imageID = ResouesUtils.mmImageArray[index]; } else if (askerText.contains("精忠报国")) { answer = ResouesUtils.markTextArray[0]; imageID = ResouesUtils.markImageArray[0]; }else if (askerText.contains("奶茶妹")) { answer = ResouesUtils.markTextArray[2]; imageID = ResouesUtils.mmImageArray[4]; }else if (askerText.contains("开会")) { answer = ResouesUtils.markTextArray[1]; imageID = ResouesUtils.markImageArray[1]; } else if (askerText.contains("报警")) { String phoneNumber = "110"; Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); return; }else if(askerText.contains("120")) { String phoneNumber = "120"; Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); startActivity(intentPhone); return; } else if (askerText.contains("打开微信")) { Intent intent = new Intent(); ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setComponent(cmp); startActivity(intent); return; } else if (askerText.contains("拍照")) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机 // photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; startActivity(intent); return; }else if(askerText.contains("名字")) { answer = ResouesUtils.mmTextArray[3]; }else if(askerText.contains("我在哪儿")) { answer = ResouesUtils.mmTextArray[4]; }else if(askerText.contains("班长是谁")) { answer = ResouesUtils.mmTextArray[5]; }else if(askerText.contains("老师是谁")) { answer = ResouesUtils.mmTextArray[6]; imageID = ResouesUtils.mmImageArray[3]; }else if(askerText.contains("你会做什么")) { answer = ResouesUtils.mmTextArray[7]; }else if(askerText.contains("爱你")) { answer = ResouesUtils.mmTextArray[8]; } sb = new StringBuffer(); } else { // 还没有把数据解析完毕, return回去, 不去执行后面的代码, 继续下一次拼接. return; } ConversationInfo info = new ConversationInfo(askerText, null, -1, true); conversationList.add(info); mAdapter.notifyDataSetChanged(); // 准备回答的数据. info = new ConversationInfo(null, answer, imageID, false); conversationList.add(info); mAdapter.notifyDataSetChanged(); mListView.setSelection(conversationList.size()); // 把answer说出来 mSpeechUtils.speakText(MainActivity.this, answer); } @Override public void onError(SpeechError speechError) { Toast.makeText(MainActivity.this, "识别出错了", Toast.LENGTH_SHORT).show(); } } /** * 解析json * @param resultString * @return */ private String getVoice(String resultString) { Gson gson = new Gson(); SpeechBean voice = gson.fromJson(resultString, SpeechBean.class); List<SpeechBean.WS> ws = voice.ws; StringBuffer sb = new StringBuffer(); for (SpeechBean.WS wsBean : ws) { String str = wsBean.cw.get(0).w; sb.append(str); } return sb.toString(); } class MyAdapter extends BaseAdapter { @Override public int getCount() { return conversationList.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if(convertView == null) { view = View.inflate(MainActivity.this, R.layout.listview_item, null); } else { view = convertView; } View answerView = view.findViewById(R.id.ll_answer); TextView answerText = (TextView) view.findViewById(R.id.tv_answer_text); ImageView answerImage = (ImageView) view.findViewById(R.id.iv_answer_image); TextView askerText = (TextView) view.findViewById(R.id.tv_asker_text); ConversationInfo info = conversationList.get(position); if(info.isAsker()) { // 当前是提问者, 隐藏回答者布局 answerView.setVisibility(View.GONE); askerText.setVisibility(View.VISIBLE); askerText.setText(info.getAskerText()); } else { // 当前是回答者, 隐藏提问者布局 answerView.setVisibility(View.VISIBLE); askerText.setVisibility(View.GONE); answerText.setText(info.getAnswerText()); if(info.getImageID() == -1) { answerImage.setVisibility(View.GONE); } else { answerImage.setVisibility(View.VISIBLE); answerImage.setImageResource(info.getImageID()); } } return view; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } } }