package com.example.admin.tim.Activity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManager;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import com.example.admin.tim.Http.Asycn;
import com.example.admin.tim.R;
import org.json.JSONObject;
import java.util.ArrayList;
/**
* Created by Administrator on 2017/12/9 0009.
*/
public class BaseActivity extends AppCompatActivity{
EventManager asr;
String finalResult;
ProgressBar progressBar;
TextView content;
Asycn asycn;
Toolbar toolbar;
TextView bottomTextView;
Button button;
ImageView imageView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initPermission();
}
private void initPermission() {
String permissions[] = {Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
ArrayList<String> toApplyList = new ArrayList<String>();
for (String perm :permissions){
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
toApplyList.add(perm);
//进入到这里代表没有权限.
}
}
String tmpList[] = new String[toApplyList.size()];
if (!toApplyList.isEmpty()){
ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 此处为android 6.0以上动态授权的回调,用户自行实现。
}
}
package com.example.admin.tim.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.widget.NestedScrollView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.baidu.speech.EventListener;
import com.baidu.speech.EventManagerFactory;
import com.baidu.speech.asr.SpeechConstant;
import com.example.admin.tim.Adapter.RecyAdapter;
import com.example.admin.tim.Bean.Label;
import com.example.admin.tim.Error.ErrorTranslation;
import com.example.admin.tim.Http.Asycn;
import com.example.admin.tim.R;
import com.example.admin.tim.UI.FingerWaveView;
import com.example.admin.tim.interfacee.PopListener;
import com.example.admin.tim.interfacee.RecycleChangeListener;
import com.example.admin.tim.interfacee.viewChangeListener;
import com.example.admin.tim.voice.RecogResult;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends BaseActivity implements EventListener {
private RecyclerView recyclerView;
private RecyAdapter recyAdapter;
NestedScrollView nestedScrollView;
private List<Label> list;
boolean once=false;
private FingerWaveView fingerWaveView;
private RecycleChangeListener recycleChangeListener=new RecycleChangeListener() {
@Override
public void change(Label l) {
list.add(l);
recyAdapter.notifyItemChanged(list.size());
//Log.e("Lin",l.getText()+":"+l.getLabel());
//recyclerView.scrollToPosition(recyAdapter.getItemCount()-1);
Log.d("Lin","recycle"+recyclerView.getHeight());
Log.d("Lin","recycle"+recyclerView.getLayoutParams().height);
//recyclerView.smoothScrollToPosition(recyAdapter.getItemCount()-1);
if (once) {
once=false;
nestedScrollView.smoothScrollTo(0,(recyclerView.getHeight()+1000));
//nestedScrollView.scrollTo(0, recyclerView.getHeight()+1000);
}
}
};
private com.example.admin.tim.interfacee.viewChangeListener viewChangeListener;
public void getListener(viewChangeListener viewChangeListener){
this.viewChangeListener=viewChangeListener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
asr= EventManagerFactory.create(this,"asr");
asr.registerListener(this);
}
private void initView() {
toolbar=(Toolbar)findViewById(R.id.tool);
setSupportActionBar(toolbar);
toolbar.setTitle("Vio");
list=new ArrayList<>();
nestedScrollView=(NestedScrollView)findViewById(R.id.nest);
bottomTextView=(TextView)findViewById(R.id.tv_finger_status);
imageView=(ImageView)findViewById(R.id.iv);
progressBar=(ProgressBar)findViewById(R.id.pro);
progressBar.setVisibility(View.GONE);
imageView.setVisibility(View.GONE);
bottomTextView.setVisibility(View.GONE);
fingerWaveView=(FingerWaveView)findViewById(R.id.view_custom);
content=(TextView)findViewById(R.id.content);
content.setText("1.可以说出城市名字 比如 北京 会显示天气状况"+"\n"+"2.可以说 热点 显示最近的热点新闻"+
"\n3.可以说 名言 会随机显示一句名言"+"\n4.可以说 你的星座 比如 天蝎座 会获取星座运势"+"\n5.其他 说其他的会有机器人跟你聊天 ");
Label label=new Label();
label.setLabel("in");
label.setText("dwadwa");
list.add(label);
//Log.d("Lin","Lable"+label.getLabel()+label.getText());
recyclerView=(RecyclerView)findViewById(R.id.recy);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyAdapter=new RecyAdapter(this,list);
recyclerView.setAdapter(recyAdapter);
button=(Button)findViewById(R.id.button_send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
start();
bottomTextView.setText("请说。。。");
imageView.setVisibility(View.VISIBLE);
bottomTextView.setVisibility(View.VISIBLE);
viewChangeListener.viewStart();
fingerWaveView.bringToFront();
bottomTextView.bringToFront();
imageView.bringToFront();
button.setClickable(false);
}
});
}
private void start(){
Map<String, Object> params = new LinkedHashMap<String, Object>();
String event = null;
event = SpeechConstant.ASR_START; // 替换成测试的event
params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false);
params.put(SpeechConstant.VAD, SpeechConstant.VAD_TOUCH);
//下面这句是长语音
//params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT,1500);
// params.put(SpeechConstant.NLU, "enable");
// params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 800);
// params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN);
// params.put(SpeechConstant.PROP ,20000);
String json = null; //可以替换成自己的json
json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json
asr.send(event, json, null, 0, 0);
Log.d("Lin","asr start");
}
private void stop() {
Log.d("Lin"," asr stop");
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
}
@Override
public void onEvent(String s, String s1, byte[] bytes, int i, int i1) {
if(s.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)){
// 引擎就绪,可以说话,一般在收到此事件后通过UI通知用户可以说话了
}
if(s.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)){
// 识别结束.
Label label=new Label();
label.setLabel("in");
label.setText(finalResult);
recycleChangeListener.change(label);
once=true;
String url="https://free-api.heweather.com/s6/weather/now?location="+finalResult+"&key=3c0a78cc87b0428281065a9572dc4a6f";
asycn=new Asycn(progressBar,url,finalResult,recycleChangeListener);
imageView.setVisibility(View.GONE);
bottomTextView.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
progressBar.bringToFront();
asycn.execute(url,"weather");
RecogResult recogResult1 = RecogResult.parseJson(s1);
if (recogResult1.hasError()) {
int errorCode = recogResult1.getError();
int subErrorCode = recogResult1.getSubError();
String error = "错误代码:" + errorCode + "\n错误信息:" + ErrorTranslation.recogError(errorCode)+
"\n具体内容:"+recogResult1.getDesc();
if (error != null) {
Log.e("Lin", error);
viewChangeListener.viewEnd();
bottomTextView.setText("出现错误请联系程序员");
stop();
}
}
}
if (s.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) {
RecogResult recogResult = RecogResult.parseJson(s1);
//Log.d("Lin",recogResult+"");
// 临时识别结果, 长语音模式需要从此消息中取出结果
String[] results = recogResult.getResultsRecognition();
//Log.d("Lin","result"+results+"");
finalResult=results[0];
Log.d("Lin",finalResult);
stop();
button.setClickable(true);
viewChangeListener.viewEnd();
bottomTextView.setText("识别完成");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0);
}
}
package com.example.admin.tim.Adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.admin.tim.Bean.Label;
import com.example.admin.tim.R;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2017/12/9 0009.
*/
public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.My> {
List<Label> mList=new ArrayList<>();
Context mContext;
public RecyAdapter(Context context, List<Label> list){
this.mList=list;
Log.d("Lin",list.get(list.size()-1).getText());
this.mContext=context;
}
@Override
public My onCreateViewHolder(ViewGroup parent, int viewType) {
View inflate;
inflate = LayoutInflater.from(mContext).inflate(R.layout.right, null);
Log.d("Lin","inflate"+inflate+"");
return new My(inflate);
}
@Override
public void onBindViewHolder(My holder, int position) {
final Label user = this.mList.get(position);
if (mList.get(position).getLabel().equals("in")){
holder.rightText.setText(user.getText());
Log.d("Lin","Text ++"+holder.rightText.getText()+"");
Log.d("Lin","Text ++"+holder.leftText.getText()+"");
holder.leftText.setVisibility(View.GONE);
}else {
holder.leftText.setText(user.getText());
Log.d("Lin","Text ++"+holder.leftText.getText()+"");
holder.rightText.setVisibility(View.GONE);
}
}
@Override
public int getItemCount() {
return mList.size();
}
class My extends RecyclerView.ViewHolder {
TextView leftText;
TextView rightText;
public My(View itemView) {
super(itemView);
rightText=(TextView)itemView.findViewById(R.id.text0);
leftText=(TextView)itemView.findViewById(R.id.teww);
}
}
}