基于Android的智能聊天机器人的设计与实现.doc_第1页
基于Android的智能聊天机器人的设计与实现.doc_第2页
基于Android的智能聊天机器人的设计与实现.doc_第3页
基于Android的智能聊天机器人的设计与实现.doc_第4页
基于Android的智能聊天机器人的设计与实现.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Android的智能聊天机器人的设计与实现学院名称:专 业:班 级:学 号:姓 名:任课教师:安卓智能聊天机器人开发(一)这个聊天机器人有点像前段时间很火的一个安卓应用小黄鸡应用的实现其实很简单,网上有许多关于智能机器人聊天的接口,我们只需要去调用对应的接口,遵守它的API开发规范,就可以获取到我们想要的信息这里我使用的接口是图灵机器人(/openapi/)这个接口给我们返回的是Json字符串,我们只需要对它进行Json字符串解析,就可以实现这个应用。开发步骤:首先我们需要到这个图灵机器人的官网去注册一个账号,他会给我们一个唯一Key,通过这个Key和对应的API开发规范,我们就可以进行开发了。然后在这个(/openapi/cloud/access_api.jsp)网址里可以找到相关的开发介绍比如:请求方式,参数,返回参数,包括开发范例,一些返回的编码等信息这里是官方提供的一个调用小案例(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 = /openapi/api?key= 注册激活返回的Apikey&info=+INFO; 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简要使用笔记(/lichenwei/p/3987429.html)代码如下:具体看注释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 = /openapi/api;/ 接口请求地址 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 byte124;/ 用来接收输入流的字节数组 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 + &info= + msg; 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) = 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 a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论