




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于An droid的智能聊天机器人的设计与实现 学院名称: 专 业: 班 级: 学 号: 姓 名: 任课教师: 安卓智能聊天机器人开发(一) 小黄鸡 这个聊天机器人有点像前段时间很火的一个安卓应用 Word资料 应用的实现其实很简单,网上有许多关于智能机器人聊天的接口,我们只需要去 调用对应的接口,遵守它的 API开发规,就可以获取到我们想要的信息 这里我使用的接口是图灵机器人(.tuling123./openapi/) 这个接口给我们返回的是Json字符串,我们只需要对它进行 Json字符串解析, 就可以实现这个应用。 开发步骤: 首先我们需要到这个图灵机器人的官网去注册一个账号,他会给我
2、们一个唯 Key,通过这个Key和对应的API开发规,我们就可以进行开发了 TLRING- RODOi 个人中心 X tv宵科 .功餐辭 曾卸取 Stri ng requesturl = .tuli ng123./ope napi/api?key=注册激活返回的 Apike y HttpGet request = new HttpGet(requesturl); HttpResp onse resp onse = HttpClie nts.createDefault().execute(request); /200即正确的返回码 if(resp on se.getStatusL in e().
3、getStatusCode()=200) String result = EntityUtils.toString(response.getEntity(); System.out.pri ntln(返回结果:+result); 好了,接下来开始实战吧,这个应用我打算写成两篇文章 第一篇讲下关于如何调用接口,从网上获取数据,包括解析Json字符串 第二篇会把这些获取的数据嵌入到安卓应用 4 1 UKE-hd L MBrSa, 忙暂.ans 現so JJPJ 用“序醫天无孙屈事际S应用LJTF蜩曰 kc會Et非锐H i空m1咚 诃如 彳尿幸节. WllA24fi311:典5 import jav
4、a.io.ByteArrayOutputStream; import java.io .IO Exceptio n; import java.io .In putStream; import java.io.U nsupportedE ncodi ngExceptio n; import java. net.HttpURLC onn ectio n; import java. net.MalformedURLExceptio n; import java .n et.URLE ncoder; import java.util.Date; import an droid.util.Log; im
5、port .example.pojo.Message; import .example.pojo.Message.Type; import .example.pojo.Result; import .google.gs on.Gson; 获取信息帮助类传入用户输入的字符,给出相对应的信息 */ public class GetDataUtils private static final String API_KEY =这里填写官方提供的 KEY;/ 申请的 api_keyB private static final Stri ng URL = .tuli ng123./ope nap i/ap
6、i;接口请求地址 public String getChat(String msg) /这个方法是获取服务端返回回来的 Json 数据,msg为用户输入的信息 String result = ;/存放服务器返回信息的变量 In putStream in putStream = n ull; ByteArrayOutputStream outputStream = n ull; try /进行资源请求 .URL url = new .URL(getMsgUrl(msg); HttpURLCo nn ection httpURLCo nn ection = (HttpURLCo nn ectio
7、n) url .ope nConn ectio n(); 打开资源连接 / HttpURLConnection 参数设定 httpURLCo nn ectio n.setReadTimeout(5 * 1000); httpURLCo nn ectio n.setCo nn ectTimeout(5 * 1000); httpURLCo nn ectio n.setRequestMethod(GET); in putStream = httpURLC onn ecti on. getl nputStream();获取一个 输入流接收服务端返回的信息 in t le n = -1; byte b
8、s = new byte124; 用来接收输入流的字节数组 outputStream = new ByteArrayOutputStream();/用一个输出流来 输出刚获取的输入流所得到的信息 while (le n = in putStream.read(bs) != -1) /从输入流中读取一定 数量的字节,并将其存储在缓冲区数组 / bs 中 outputStream.write(bs, 0, le n); 往输入流写入 outputStream.flush(); 清除缓冲区 result = new Stri ng(outputStream.toByteArray();转换成字符串
9、catch (MalformedURLException e) e.pri ntStackTrace(); catch (IOExcepti on e) e.pri ntStackTrace(); fin ally /关闭相关资源 if (in putStream != n ull) try in putStream.close(); catch (IOExcepti on e) e.pri ntStackTrace(); if (outputStream != n ull) try outputStream.close(); catch (IOExcepti on e) e.pri ntSt
10、ackTrace(); Log.i(tuzi, result: + result);/ 打印测试日志 return result; private String getMsgUrl(Stri ng msg) throws Un supportedE ncod in gExcepti on Stri ng path =; String info = URLEncoder.encode(msg, UTF-8);/ 转换 url 编码 path = URL + ?key= + API_KEY + return path; public Message get In fo(Stri ng msg) M
11、essage message=new Message。; Gson gson=new Gson(); try Result result=gson.fromJson(getChat(msg), Result.class);/ 获取至U 服务器返回的json并转换为Result对象,Result对象可能不存在,会出现异常 message.setMsg(result.getText();/message 可能为空,需要捕获异 常 catch (Excepti on e) /可能服务器没有返回正常数据,也就存在着空白容,需要捕获异 常 message.setMsg(服务器繁忙,请稍后再试); mes
12、sage.setTime( new Date(); message.setType(Type.lNCOME); return message; 下面这2个是实体类,根据官网提供的示例,返回的Json字符串里包含:code 状态码,text文本容 package .example.pojo; /* 用来映射返回Json字符串 */ public class Result private String code; private String text; public String getCode() retur n code; public void setCode(Stri ng code)
13、this.code = code; public String getText() return text; public void setText(Stri ng text) this.text = text; package .example.pojo; import java.util.Date; public class Message private String n ame; private String msg; private Date time; private Type type; public enum Type类型枚举,发送,接收 INCOME,OUTCOME publ
14、ic Stri ng getName() return n ame; public void setName(String name) this. name = n ame; public Stri ng getMsg() return msg; public void setMsg(Stri ng msg) this.msg = msg; public Date getTime() return time; public void setTime(Date time) this.time = time; public Type getType() return type; public vo
15、id setType(Type type) this.type = type; 编写个测试类 package .example.test; import an droid.test.A ndroidTestCase; import an droid.util.Log; import .example.pojo.Message; import .example.utils.GetDataUtils; public class GetDataUtilsTest exte nds An droidTestCase public void test() GetDataUtils dataUtils=n
16、ew GetDataUtils(); Message message=dataUtils.getInfo(你好); Message message仁dataUtils.getlnfo(你是谁); Message message2=dataUtils.getlnfo(你知道 JAVA是什么吗); Message message3=dataUtils.getlnfo(下雨了,天好冷); Log.i(兔子,message.getMsg(); Log.i(兔子,message1.getMsg(); Log.i(兔子,message2.getMsg(); Log.i(兔子,message3.getMsg
17、(); 在JAVA WEB里编写测试单元用到的是Jun it,需要导入jar包,在安卓开发里也 有类似这样的步骤 首先我们要在AndroidManifest.xml里的application标签里添加 然后在application外添加 由于需要联网别忘了给应用赋予网络权限 vuses-permissi on an droid: name =a ndroid.permissio n.lN TERNET / 这里是完整文件代码: vuses-permissi on an droid: name=a ndroid.permissio nN TERNET / vuses-library an dro
18、id:n ame=a ndroid.test.r unn er / vactivity an droid: name=.Mai nActivity an droid:label=stri ng/app_ name vacti on an droid: name=a ndroid.i nten t.actio n. MAIN / vcategory an droid: name=a ndroid.i nte nt.category.LAUNCHER / v/inten t-filter v/activity v/applicati on vin strume ntati on an droid:
19、 name=a ndroid.test .In strume ntatio nTestR unner an droid:label=ceshi an droid:targetPackage=.example.a ndroidchat 看下我们的测试代码效果图: FED TD 3LiM Mli44.ni nU-. KEdSLjEhB.X Miqh. MMEVLlChM TiMKtaMI Ft -jUcILzxria: Wh 3L-Z-4 I* 3L-MT?l 3LM IhW- 11-:ills 1L-M厂 NAHil|tiW4L4eiW Mflk EUV I SEjrOI DAdrlMl LL-
20、H LkNi4fi444 L-t.-acdOi.di:rwr I-lltJZaUME ruu;: : | : 13 D:= 1 Dr: 牛-于=规尸忙亶址龙于併事夬; MllLl 1dialUNriDlp FWI昂供騎畔- w.T*卅挥 ft 豪關 二* Xi |宜匚豆丁) i, mMiih -1 AE import java.text.SimpleDateFormat; import java.util.List; import .example.pojo.Msg; import .example.pojo.Msg.Type; import an droid.c onten t.C on t
21、ext; import an droid.view. LayoutI nflater; import an droid.view.View; import an droid.view.ViewGroup; import an droid.widget.BaseAdapter; import an droid.widget.TextView; /* * * ListView适配器 * */ public class ChatAdapter exte nds BaseAdapter private List data; private Layout In flater in flater;/ 布局
22、工厂,可以把 res/layout 的 xml 布局文 件转换成view对象 public ChatAdapter(Co ntext co ntext, List data) in flater = LayoutI nflater.from(co ntext); this.data = data; Override public int getCo un t() return data.size(); Override public Object getltem(i nt positi on) retur n data.get(positi on); Override public long
23、getltemld(i nt positi on) retur n positi on; Override public View getView(i nt positi on. View conv ertView, ViewGroup pare nt) Msg message = data.get(positi on); ViewHolder viewHolder = n ull; if (co nvertView = n ull) /未加载布局文件对象 /可以通过getltemViewType所定义的标识来设定对应的item样 式 if (getItemViewType(positio n
24、) = 0) / 接收信息 viewHolder = new ViewHolder(); conv ertView = in flater.i nflate(R .l ayout.se nd_msg, n ull); viewHolder.time = (TextView) conv ertView .fin dViewByld(R.id.receivetime); viewHolder.msg = (TextView) conv ertView .fin dViewByld(R.id.receivemsg); else viewHolder = new ViewHolder(); conve
25、rtView = inflater.inflate(R.layout.receive_msg, null); viewHolder.time = (TextView) conv ertView .fin dViewByld(R.id.se ndtime); viewHolder.msg = (TextView) conv ertView .fin dViewByld(R.id.se ndmsg); con vertView.setTag(viewHolder); else /已经存在布局文件对象 viewHolder = (ViewHolder) conv ertView.getTag();
26、/设置数据 SimpleDateFormat dateFormat = new SimpleDateFormat( yyyy-MM-dd HH:mm:ss); viewHolder.time.setText(dateFormat.format(message.getTime(); viewHolder.msg.setText(message.getMsg(); return conv ertView; /* *由于此处我们要返回2种ListView的Item样式,需要再额外多覆写2个 方法 * (1)、getItemViewType(int position)给定类型标示符 * (2)、get
27、ViewTypeCount()类型数量 */ Override public int getItemViewType(i nt positi on) Msg message = data.get(positi on); if (message.getType() = Type.INCOME) return 0;/如果消息类型为接收,则值为0 return 1;/如果消息类型为发送,则值为1 Override public int getViewTypeCo un t() return 2; private final class ViewHolder TextView time;/ 消息时间
28、TextView msg;/ 消息容 然后就是主程序代码了: 这里就没什么好说的了,网络数据获取工具类包括ListView的适配器类在之前已 经提过,这里就只剩下调用了。 注意点有3: 1、 那就是在UI主线程里不能直接取获取网络数据,这里我们需要另开一个子线 程去获取,然后在通过 Handler去更新UI界面。 2、当数据源发生更新的时候,需要在 UI主线程去操作,而不是子线程,还有就 是不应该去重新设置Adapter,只需要去调用Adapter的notifyDataSetChanged() 就行。 3、记得设置下ListView的setSelection选项,便于焦点自动往下拉。 不在UI
29、主线程里做耗时操作,会使得 UI现成阻塞。不在子线程里去更新 UI界 面,会导致应用程序无响应。 package .example.a ndroidchat; import java.util.ArrayList; import java.util.Date; import java.util.List; import an droid.app.Activity; import an droid.os.B un dle; import an droid.os.Ha ndler; import an droid.os.Message; import an droid.view.View; imp
30、ort an droid.view.View. On ClickListe ner; import an droid.widget.Butt on; import an droid.widget.EditText; import an droid.widget.ListView; import .example.pojo.Msg; import .example.pojo.Msg.Type; import .example.utils.GetDataUtils; public class Main Activity exte nds Activity private ListView list
31、view; private EditText sen dmsg; private Butt on sen dbt; private ChatAdapter adapter;/ListView 自定义适配器 private List data;/ 数据源 private Han dler han dler =new Han dler() public void han dleMessage(Message msg) Msg receiveMsg=(Msg) msg.obj; data.add(receiveMsg); adapter. no tifyDataSetCha nged(); list
32、view.setSelection(data.size()-1); 定位位置,自动下拉 ; ; Override protected void on Create(B un dle saved In sta nceState) super.o nCreate(savedl nsta nceState); setC onten tView(R .1 ayout.activity_ma in); ini tView();初始化控件 in itData();初始化数据 initAction();/初始化事件 private void in itActio n() this.se ndbt.set On ClickListe ner(new On ClickListe ner() Override public void on Click(Vi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025纸箱购销合同范本
- 2025特许经营店转让合同
- 2025年独立运行风力发电机组控制器及逆变器合作协议书
- 2025年新型功能材料合作协议书
- 2025年新型地热用热交换器项目建议书
- 2025年磁性载体材料项目合作计划书
- 2025年大数据与人工智能课程考试试题及答案
- 焦炉放散施工方案
- 悬空电缆施工方案
- 2024初级社会工作者职业资格笔试考试资料
- 建筑施工大型机械设备安全使用与管理培训
- T-CNPPA 3027-2024 药品泡罩包装应用指南
- 山东省潍坊市2025届高考数学二模试卷含解析
- 6S管理制度(可参考)-6s管理制度
- 四肢与关节检查
- 产后抑郁症讲课课件
- 低碳生活 主题班会课件-2篇
- 会下金蛋的鹅课件
- 实验室组织机构图
- 2024年河南省郑州市中考一模语文试题(含答案解析)
- 2024年《金融市场基础知识》冲刺复习讲义
评论
0/150
提交评论