




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 Android 的智能聊天机器人的设计与实现 学院名称 专 业 班 级 学 号 姓 名 任课教师 安卓智能聊天机器人开发 一 这个聊天机器人有点像前段时间很火的一个安卓应用 小黄鸡 应用的实现其实很简单 网上有许多关于智能机器人聊天的接口 我们只需要 去调用对应的接口 遵守它的 API 开发规范 就可以获取到我们想要的信息 这里我使用的接口是 图灵机器人 这个接口给我们返回的是 Json 字符串 我们只需要对它进行 Json 字符串解析 就可以实现这个应用 开发步骤 首先我们需要到这个图灵机器人的官网去注册一个账号 他会给我们一个唯一 Key 通过这个 Key 和对应的 API 开发规范 我们就可以进行开发了 然后在这个 网址里可以找到相关的开发介绍 比如 请求方式 参数 返回参数 包括开发范例 一些返回的编码等信息 这里是官方提供的一个调用小案例 JAVA 这里我也顺带贴一下 调用图灵机器人平台接口 需要导入的包 commons logging 1 0 4 jar httpclient 4 3 1 jar httpcore 4 3 jar public static void main String args throws IOException String INFO URLEncoder encode 北京今日天气 utf 8 String requesturl 注册激活返回的 Apikey HttpGet request new HttpGet requesturl HttpResponse response HttpClients createDefault execute request 200 即正确的返回码 if response getStatusLine getStatusCode 200 String result EntityUtils toString response getEntity System out println 返回结果 result 好了 接下来开始实战吧 这个应用我打算写成两篇文章 第一篇讲下关于如何调用接口 从网上获取数据 包括解析 Json 字符串 第二篇会把这些获取的数据嵌入到安卓应用 首先 先写一个工具类 这个工具类是用来获取用户输入的信息并返回服务器 提供的数据的 这里面用到了一个第三方提供的 JAR 包 Gson 它是谷歌提供给我们用来使 Json 数据序列化和反序列化的 关于 Gson 的使用我之前写过一篇笔记 不熟悉的朋友可以看看 Gson 简要 使用笔记 代码如下 具体看注释 package com example utils import java io ByteArrayOutputStream import java io IOException import java io InputStream import java io UnsupportedEncodingException import HttpURLConnection import MalformedURLException import URLEncoder import java util Date import android util Log import com example pojo Message import com example pojo Message Type import com example pojo Result import com google gson Gson 获取信息帮助类 传入用户输入的字符 给出相对应的信息 public class GetDataUtils private static final String API KEY 这里填写官方提供的 KEY 申 请的 API KEY 值 private static final String URL 接口请求地址 public String getChat String msg 这个方法是获取服务端返回回来的 Json 数据 msg 为用户输入的信息 String result 存放服务器返回信息的变量 InputStream inputStream null ByteArrayOutputStream outputStream null try 进行资源请求 URL url new URL getMsgUrl msg HttpURLConnection httpURLConnection HttpURLConnection url openConnection 打开资源连接 HttpURLConnection 参数设定 httpURLConnection setReadTimeout 5 1000 httpURLConnection setConnectTimeout 5 1000 httpURLConnection setRequestMethod GET inputStream httpURLConnection getInputStream 获 取一个输入流接收服务端返回的信息 int len 1 byte bs new byte 124 用来接收输入流的字节数组 outputStream new ByteArrayOutputStream 用一个输 出流来输出刚获取的输入流所得到的信息 while len inputStream read bs 1 从输入流中读 取一定数量的字节 并将其存储在缓冲区数组 bs 中 outputStream write bs 0 len 往输入流写入 outputStream flush 清除缓冲区 result new String outputStream toByteArray 转换成 字符串 catch MalformedURLException e e printStackTrace catch IOException e e printStackTrace finally 关闭相关资源 if inputStream null try inputStream close catch IOException e e printStackTrace if outputStream null try outputStream close catch IOException e e printStackTrace Log i tuzi result result 打印测试日志 return result private String getMsgUrl String msg throws UnsupportedEncodingException String path String info URLEncoder encode msg UTF 8 转换 url 编码 path URL key API KEY return path public Message getInfo String msg Message message new Message Gson gson new Gson try Result result gson fromJson getChat msg Result class 获取到服务器返回的 json 并转换为 Result 对象 Result 对象可能不存在 会 出现异常 message setMsg result getText message 可能为空 需要 捕获异常 catch Exception e 可能服务器没有返回正常数据 也就存在着空白内容 需要捕 获异常 message setMsg 服务器繁忙 请稍后再试 message setTime new Date message setType Type INCOME return message 下面这 2 个是实体类 根据官网提供的示例 返回的 Json 字符串里包含 code 状态码 text 文本内容 package com example pojo 用来映射返回 Json 字符串 public class Result private String code private String text public String getCode return code public void setCode String code this code code public String getText return text public void setText String text this text text package com example pojo import java util Date public class Message private String name private String msg private Date time private Type type public enum Type 类型枚举 发送 接收 INCOME OUTCOME public String getName return name public void setName String name this name name public String getMsg return msg public void setMsg String msg this msg msg public Date getTime return time public void setTime Date time this time time public Type getType return type public void setType Type type this type type 编写个测试类 package com example test import android test AndroidTestCase import android util Log import com example pojo Message import com example utils GetDataUtils public class GetDataUtilsTest extends AndroidTestCase public void test GetDataUtils dataUtils new GetDataUtils Message message dataUtils getInfo 你好 Message message1 dataUtils getInfo 你是谁 Message message2 dataUtils getInfo 你知道 JAVA 是什么吗 Message message3 dataUtils getInfo 下雨了 天好冷 Log i 兔子 message getMsg Log i 兔子 message1 getMsg Log i 兔子 message2 getMsg Log i 兔子 message3 getMsg 在 JAVA WEB 里编写测试单元用到的是 Junit 需要导入 jar 包 在安卓开发 里也有类似这样的步骤 首先我们要在 AndroidManifest xml 里的 application 标签里添加 然后在 application 外添加 由于需要联网别忘了给应用赋予网络权限 这里是完整文件代码 看下我们的测试代码效果图 好了 此时我们已经可以获取到服务端的数据 并且接收到客户端并做处理 在上一篇文章中 已经实现了对网络数据的获取和处理封装 这篇文章来讲下 如何嵌入到安卓应用中 先看下效果图 从上面两张图我们可以发现 这个聊天布局其实就是一个 ListView 只不过它 和传统的 ListView 有些区别 因为它使用了多 Item 样式布局 首先 先来分析下基础布局 这个界面是由 3 个布局文件组成 分别是主布局 发送消息样式布局 接收消 息样式布局 先来看下主布局 这里是对应的主布局代码 android divider null 去除 ListView 的 Item 分割线 再来看下消息布局 由于消息布局只是左右两边方向的不同 这里只给出其 中一个 这是 2 个消息布局的代码 接下来看下关于 ListView 的自定义适配器 和往常一样自定义适配器需要继承 BaseAdapter 并实现一些必须的方法 这里有个需要注意的是 因为传统的 ListView 是统一一个样式的 而这里的聊 天布局是左右两边收发信息多 Item 样式 所以需要额外的多覆写 2 个方法 1 getViewTypeCount 返回样式的种类数目 2 getItemViewType 给定类型标示符 便于在回调函数 getView 时 让系统知道我们需要显示的哪个样式 代码里还提到了 ViewHolder 这个是优化 ListView 加载速度的一种方法 关 于这个知识点我整理一篇笔记 安卓开发笔记 ListView 加载性能优化 ViewHolder 出来 不熟悉的朋友可以看看 package com example androidchat import java text SimpleDateFormat import java util List import com example pojo Msg import com example pojo Msg Type import android content Context import android view LayoutInflater import android view View import android view ViewGroup import android widget BaseAdapter import android widget TextView ListView 适配器 public class ChatAdapter extends BaseAdapter private List data private LayoutInflater inflater 布局工厂 可以把 res layout 的 xml 布局文件转换成 view 对象 public ChatAdapter Context context List data inflater LayoutInflater from context this data data Override public int getCount return data size Override public Object getItem int position return data get position Override public long getItemId int position return position Override public View getView int position View convertView ViewGroup parent Msg message data get position ViewHolder viewHolder null if convertView null 未加载布局文件对象 可以通过 getItemViewType 所定义的标识来设定对应的 item 样式 if getItemViewType position 0 接收信息 viewHolder new ViewHolder convertView inflater inflate R layout send msg null viewHolder time TextView convertView findViewById R id receivetime viewHolder msg TextView convertView findViewById R id receivemsg else viewHolder new ViewHolder convertView inflater inflate R layout receive msg null viewHolder time TextView convertView findViewById R id sendtime viewHolder msg TextView convertView findViewById R id sendmsg convertView setTag viewHolder else 已经存在布局文件对象 viewHolder ViewHolder convertView getTag 设置数据 SimpleDateFormat dateFormat new SimpleDateFormat yyyy MM dd HH mm ss viewHolder time setText dateFormat format message getTime viewHolder msg setText message getMsg return convertView 由于此处我们要返回 2 种 ListView 的 Item 样式 需要再额外多覆写 2 个方法 1 getItemViewType int position 给定类型标示符 2 getViewTypeCount 类型数量 Override public int getItemViewType int position Msg message data get position if message getType Type INCOME return 0 如果消息类型为接收 则值为 0 return 1 如果消息类型为发送 则值为 1 Override public int getViewTypeCount return 2 private final class ViewHolder TextView time 消息时间 TextView msg 消息内容 然后就是主程序代码了 这里就没什么好说的了 网络数据获取工具类包括 ListView 的适配器类在之前 已经提过 这里就只剩下调用了 注意点有 3 1 那就是在 UI 主线程里不能直接取获取网络数据 这里我们需要另开一个子 线程去获取 然后在通过 Handler 去更新 UI 界面 2 当数据源发生更新的时候 需要在 UI 主线程去操作 而不是子线程 还有 就是不应该去重新设置 Adapter 只需要去调用 Adapter 的 notifyDataSetChanged 就行 3 记得设置下 ListView 的 setSelection 选项 便于焦点自动往下拉 不在 UI 主线程里做耗时操作 会使得 UI 现成阻塞 不在子线程里去更新 UI 界面 会导致应用程序无响应 package com example androidchat import java util ArrayList import java util Date import java util List import android app Activity import android os Bundle import android os Handler import android os Message import android view View import android view View OnClickListener import android widget Button import android widget EditText import android widget ListView import com example pojo Msg import com example pojo Msg Type import com example utils GetDataUtils public class MainActivity extends Activity private ListView listview private EditText sendmsg private Button sendbt private ChatAdapter adapter ListView 自定义适配器 private List data 数据源 private Handler handler new Handler public void handleMessage Message msg Msg receiveMsg Msg msg obj data add receiveMsg adapter notifyDataSetChanged listview setSelection data size 1 定位位置 自动下拉 Override protected void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView R layout activity main initView 初始化控件 initData 初始化数据 initAction 初始化事件 private void initAction this sendbt set
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 梳理缝编非织造布制作工成本控制考核试卷及答案
- 漆器彩绘雕填工抗压考核试卷及答案
- 辐射废物处理技术风险评估与管理分析报告
- 重庆学校活动设备策划方案
- 碳排放交易员专项考核试卷及答案
- 义诊咨询工作方案
- 大型养路机械司机适应性考核试卷及答案
- 校园招聘效果追踪报告
- 学前儿童发展心理学考试真题
- 含氟烯烃生产工理念考核试卷及答案
- 2025至2030中国棉花行业市场发展分析及前景预测与投资发展战略报告
- 图书出口管理办法
- 高三后期班级管理课件
- 廉政教育进课堂大学
- GB/T 45777-2025水泥中石膏掺量评估方法
- 电气火灾防治课件
- 消防车救火课件
- 产业发展状况分析
- 投后管理课件
- 2025年中国荣成市房地产行业市场发展监测及投资战略规划研究报告
- 2025至2030全球及中国专用交换机(PBX)行业产业运行态势及投资规划深度研究报告
评论
0/150
提交评论