海康机器人
系统平台架构海康机器人软件平台架构的核心为iWMS-1000智能仓储管理系统和RCS-2000机器人控制系统两大平台。iWMS-1000可与企业上层系统无缝对接,结合业务编排和自主研发的上架推荐算法、库存分配算法、波次算法、冷热度分析算法等多种数据挖掘和人工智能技术,从而高效低成本实现仓储管理智能化。RCS-2000支持一站式地图编辑、3D可视化业务实时展示。支持多种车型统一调度,实现了多机器人任务最优分配,路径规划及道路交通管制,让机器人协同工作又不相互影响,使效能最大化。RCS-2000支持基于业务场景抽象业务块,能够通过业务块之间的逻辑连接,灵活编排业务场景。iWMS-1000和RCS-2000同时支持低代码方式进行二次开发,满足业务快速上线,场景灵活覆盖。Android 简单的智能机器人聊天软件
聊天接口是网上找的,我用的是图灵机器人,注册后拿到key值,然后,就可以动手下代码。
个人认为,聊天机器人最大的难点有三个
1、布局,要实现微信那样的聊天布局确实要花费一些功夫。
2、解析数据,楼主用的是谷歌的Gson解析,解析出数据以后,重要的是判断该数据是属于文字对话,新闻,菜谱,抑或是列车。
3、布局之间的转换,由于涉及到自己和机器人,所以listview里面至少要有三个布局(一个是自己,另一个是机器人,另一个当然是聊天界面啦),重写BaseAdapter方法,让布局在两个布局之间进行转换。
楼主的布局主界面XML代码
聊天对话框代码
效果图:
解析数据:
HttpURLConnection连接
packagehttp;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.URL;publicclassHttpUtils{publicstaticStringgetJsonContent(Stringurl){Stringresult="";URLurl2;InputStreamis;InputStreamReaderisr;BufferedReaderbr;try{url2=newURL(url);HttpURLConnectionconnection=(HttpURLConnection)url2.openConnection();is=connection.getInputStream();isr=newInputStreamReader(is,"UTF-8");Stringline="";br=newBufferedReader(isr);while((line=br.readLine())!=null){result+=line;}br.close();}catch(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}if(result==""){//进行判空操作,如果没联网,会给result重新赋值而不至于是空。result="{"code":100000,"text":"亲!服务器到月球了!"}";}returnresult;}}解析数据
楼主是直接在解析类里面定义了解析函数。
Talk是定义的数据存储类。
publicstaticTalkgetTalk(Stringjson){Gsongson=newGson();Talktalk=gson.fromJson(json,Talk.class);returntalk;}自己的Talk类,所有的聊天信息全都用Talk类封装好存到list里面中,(还没学到数据库,汗,只能用list来代替了)packagecom.rebot;importjava.util.List;importcom.google.gson.Gson;publicclassTalk{privateinttype=0;//0为机器人,1为自己privateintcode;//返回类型。人默认为0privateStringtext;//返回文字privateStringtime;//发送时间Listlist;//返回的listpublicTalk(inttype,intcode,Stringtext,Stringtime){this.code=code;this.type=type;this.text=text;this.time=time;}publicintgetType(){returntype;}publicvoidsetType(inttype){this.type=type;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}publicStringgetText(){returntext;}publicvoidsetText(Stringtext){this.text=text;}publicStringgetTime(){returntime;}publicvoidsetTime(Stringtime){this.time=time;}publicListgetList(){returnlist;}publicvoidsetList(Listlist){this.list=list;}publicStringtoString(){return"type="+type+",code="+code+",text="+text+" ";}publicstaticTalkgetTalk(Stringjson){Gsongson=newGson();Talktalk=gson.fromJson(json,Talk.class);returntalk;}}楼主为了省事,把各种类型的数据全定义在了一个类里面,More类代码如下
packagecom.rebot;publicclassMore{//-------------列车------------------privateStringtrainnum;//车次privateStringstart;//起始站privateStringterminal;//到达站privateStringstarttime;//开车时间privateStringendtime;//到达时间//--------公用-------privateStringdetailurl;//详情地址privateStringicon;//图标地址//-------------------publicStringgetTrainnum(){returntrainnum;}publicvoidsetTrainnum(Stringtrainnum){this.trainnum=trainnum;}publicStringgetStart(){returnstart;}publicvoidsetStart(Stringstart){this.start=start;}publicStringgetTerminal(){returnterminal;}publicvoidsetTerminal(Stringterminal){this.terminal=terminal;}publicStringgetStarttime(){returnstarttime;}publicvoidsetStarttime(Stringstarttime){this.starttime=starttime;}publicStringgetEndtime(){returnendtime;}publicvoidsetEndtime(Stringendtime){this.endtime=endtime;}publicStringgetDetailurl(){returndetailurl;}publicvoidsetDetailurl(Stringdetailurl){this.detailurl=detailurl;}publicStringgetIcon(){returnicon;}publicvoidsetIcon(Stringicon){this.icon=icon;}publicStringgetTrain(){return"车次:"+trainnum+" 起始站:"+start+" 到达站:"+terminal+" 开车时间:"+starttime+" 到达时间:"+endtime+" 详情地址:"+detailurl+" 图标地址:"+icon;}//---------------------------------------//------------------新闻--------------------privateStringarticle;privateStringsource;publicStringgetArticle(){returnarticle;}publicvoidsetArticle(Stringarticle){this.article=article;}publicStringgetSource(){returnsource;}publicvoidsetSource(Stringsource){this.source=source;}publicStringgetNews(){return"标题:"+article+" 来源"+source+" 详情地址"+detailurl+" 图标地址"+icon;}//------------------菜谱----------------------privateStringname;//名称privateStringinfo;//详情publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetInfo(){returninfo;}publicvoidsetInfo(Stringinfo){this.info=info;}publicStringgetMenu(){return"名称:"+name+" 详情"+info+" 详情地址"+detailurl+" 图标地址"+icon;}}主界面代码
packagecom.example.n.rebot02;importjava.io.UnsupportedEncodingException;importjava.net.URLEncoder;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importhttp.HttpUtils;importcom.rebot.Talk;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.Window;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ListView;publicclassMainActivityextendsActivity{privateListViewlistView;privateEditTexteditText;privateButtonbutton;privateListtalks;privateMyAsyncTasktask;privateMyAdapteradapter;@SuppressWarnings("serial")protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main_layout);listView=(ListView)findViewById(R.id.listView);editText=(EditText)findViewById(R.id.editText);button=(Button)findViewById(R.id.button);talks=newArrayList(){{add(newTalk(0,100000,"阿尼哈希哟!",printDate()));}};adapter=newMyAdapter(MainActivity.this,talks);listView.setAdapter(adapter);//listView.setSelection(adapter.getCount());//adapter.notifyDataSetChanged();button.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){Stringmi=editText.getText().toString();//-----------添加自己--------------Talktalk=newTalk(1,100000,mi,printDate());talks.add(talk);//------------输入框设置为空---------------editText.setText("");System.out.println("==============talk:"+talk);//-----------启动AsyncTask---------StringAPIKEY="d0c05c50d03d541fc1571908b453452f";StringINFO=null;try{INFO=URLEncoder.encode(mi,"utf-8");}catch(UnsupportedEncodingExceptione){e.printStackTrace();}StringgetURL="http://www.tuling123.com/openapi/api?key="+APIKEY+"&info="+INFO;//-------------------------------adapter.notifyDataSetChanged();listView.smoothScrollToPosition(listView.getCount()-1);//-------------------------------task=newMyAsyncTask();task.execute(getURL);}});}classMyAsyncTaskextendsAsyncTask{@OverrideprotectedListdoInBackground(String...params){//---------------解析数据------------------Stringjson=HttpUtils.getJsonContent(params[0]);Talktalk=Talk.getTalk(json);//----------------添加机器人----------------System.out.println("------------talk"+talk);talk.setType(0);talk.setTime(printDate());talks.add(talk);returntalks;}protectedvoidonPostExecute(Listresult){super.onPostExecute(result);adapter.notifyDataSetChanged();listView.smoothScrollToPosition(listView.getCount()-1);}}@SuppressLint("SimpleDateFormat")publicstaticStringprintDate(){DateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");returnformat.format(newDate());}}重新定义BaseAdapterpackagecom.example.n.rebot02;importjava.util.List;importcom.rebot.Talk;importandroid.content.Context;importandroid.text.method.LinkMovementMethod;importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ImageButton;importandroid.widget.TextView;importandroid.widget.Toast;publicclassMyAdapterextendsBaseAdapter{privateContextcontext;privateListtalk;publicMyAdapter(Contextcontext,Listtalk){this.context=context;this.talk=talk;}publicintgetCount(){returntalk.size();}publicObjectgetItem(intposition){returntalk.get(position);}publiclonggetItemId(intposition){returnposition;}publicViewgetView(intposition,ViewconvertView,ViewGroupparent){Talktalk1=talk.get(position);Viewview=null;if(talk1.getType()==1){view=LayoutInflater.from(context).inflate(R.layout.mi_item,null);}else{view=LayoutInflater.from(context).inflate(R.layout.reboot_item,null);}TextViewtextView=(TextView)view.findViewById(R.id.text);TextViewtextView2=(TextView)view.findViewById(R.id.time);switch(talk1.getCode()){case100000://判断返回类型,100000为文字类聊天,305000为列车textView.setText(talk1.getText());break;case40002:textView.setText(talk1.getText());break;case305000:textView.setText(talk1.getText()+" "+talk1.getList().get(0).getTrain());break;case302000:textView.setText(talk1.getText()+" "+talk1.getList().get(0).getNews());textView.setMovementMethod(LinkMovementMethod.getInstance());break;case308000:textView.setText(talk1.getText()+" "+talk1.getList().get(0).getMenu());Log.i("main",talk1.getText()+" "+talk1.getList().get(0).getMenu());break;default:break;}textView2.setText(talk1.getTime());returnview;}}完成效果图心得:
别忘了开网络权限!
别忘了开网络权限!
别忘了开网络权限!
(重要的事情说三遍)
ListView显示最后一行:
listView.smoothScrollToPosition(listView.getCount()-1);
实时刷新ListView
adapter.notifyDataSetChanged();
去掉丑陋的标题头
requestWindowFeature(Window.FEATURE_NO_TITLE);
(这句话一定要写在super.onCreate(savedInstanceState);的下一行!)
第一次写博客,不足之处尚多,以后慢慢改进。
http://download.csdn.net/detail/jiaoyaning1210/9123123