版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.基于Android的智能聊天机器人的设计与实现学院名称:专业:班级:学号:姓名:任课教师:安卓智能聊天机器人开发(一)这个聊天机器人有点像前段时间很火的一个安卓应用小黄鸡应用的实现其实很简单,网上有许多关于智能机器人聊天的接口,我们只需要去调用对应的接口,遵守它的API开发规,就可以获取到我们想要的信息这里我使用的接口是图灵机器人(.tuling123./openapi/)这个接口给我们返回的是Json字符串,我们只需要对它进行Json字符串解析,就可以实现这个应用。开发步骤:首先我们需要到这个图灵机器人的官网去注册一个账号,他会给我们一个唯一Key,通过这个Key和对应的API开发规,我们
2、就可以进行开发了。然后在这个(.tuling123./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 = URLEnc
3、oder.encode("今日天气", "utf-8"); String requesturl = ".tuling123./openapi/api"key= 注册激活返回的Apikey&info="+INFO; HttpGet request = new HttpGet(requesturl); HttpResponse response = HttpClients.createDefault().execute(request); /200即正确的返回码 if(response.getStatusLine().g
4、etStatusCode()=200) String result = EntityUtils.toString(response.getEntity(); System.out.println("返回结果:"+result); 好了,接下来开始实战吧,这个应用我打算写成两篇文章第一篇讲下关于如何调用接口,从网上获取数据,包括解析Json字符串第二篇会把这些获取的数据嵌入到安卓应用首先,先写一个工具类,这个工具类是用来获取用户输入的信息并返回服务器提供的数据的这里面用到了一个第三方提供的JAR包,Gson它是谷歌提供给我们用来使Json数据序列化和反序列化的关于
5、Gson的使用我之前写过一篇笔记,不熟悉的朋友可以看看:Gson简要使用笔记(.cnblogs./lichenwei/p/3987429.html)代码如下:具体看注释package .example.utils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .MalformedURLException;im
6、port .URLEncoder;import java.util.Date;import android.util.Log;import .example.pojo.Message;import .example.pojo.Message.Type;import .example.pojo.Result;import .google.gson.Gson;/* * * 获取信息帮助类传入用户输入的字符,给出相对应的信息 * */public class GetDataUtils private static final String API_KEY = "这里填写官方提供的KEY&q
7、uot;/ 申请的API_KEY值 private static final String URL = ".tuling123./openapi/api"/ 接口请求地址 public String getChat(String msg) /这个方法是获取服务端返回回来的Json数据,msg为用户输入的信息 String result = "/ 存放服务器返回信息的变量 InputStream inputStream = null; ByteArrayOutputStream outputStream = null; try / 进行资源请求 .URL url =
8、 new .URL(getMsgUrl(msg); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection();/ 打开资源连接 / HttpURLConnection参数设定 httpURLConnection.setReadTimeout(5 * 1000); httpURLConnection.setConnectTimeout(5 * 1000); httpURLConnection.setRequestMethod("GET"); inputStream = htt
9、pURLConnection.getInputStream();/ 获取一个输入流接收服务端返回的信息 int len = -1; byte bs = new byte124;/ 用来接收输入流的字节数组 outputStream = new ByteArrayOutputStream();/ 用一个输出流来输出刚获取的输入流所得到的信息 while (len = inputStream.read(bs) != -1) / 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 / bs 中 outputStream.write(bs, 0, len);/ 往输入流写入 outputStream
10、.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 != n
11、ull) 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")
12、;/ 转换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.s
13、etMsg(result.getText();/message可能为空,需要捕获异常 catch (Exception e) /可能服务器没有返回正常数据,也就存在着空白容,需要捕获异常 message.setMsg("服务器繁忙,请稍后再试"); message.setTime(new Date(); message.setType(Type.INCOME); return message; 下面这2个是实体类,根据官网提供的示例,返回的Json字符串里包含:code状态码,text文本容package .example.pojo;/* * * 用来映射返回Json字符串
14、 * */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 .example.pojo;import java.util.Date;public class
15、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;
16、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 .example.test;import android.test.AndroidTestCase;import android.util.Log;import .example.pojo.Message;import .example
17、.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是什么吗");
18、 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里的applic
19、ation标签里添加<uses-library android:name="android.test.runner"/>然后在application外添加<instrumentation android:name="android.test.InstrumentationTestRunner" android:label="ceshi" android:targetPackage=".example.androidchat"></instrumentation>由于需要联网别忘了
20、给应用赋予网络权限<uses-permission android:name="android.permission.INTERNET"/>这里是完整文件代码:<"xml version="1.0" encoding="utf-8"><manifest xmlns:android="schemas.android./apk/res/android" package=".example.androidchat" android:versionCode=&qu
21、ot;1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="dr
22、awable/ic_launcher" android:label="string/app_name" android:theme="style/AppTheme" > <uses-library android:name="android.test.runner" /> <activity android:name=".MainActivity" android:label="string/app_name" > <intent-filter>
23、; <action android:name="ent.action.MAIN" /> <category android:name="ent.category.LAUNCHER" /> </intent-filter> </activity> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" androi
24、d:label="ceshi" android:targetPackage=".example.androidchat" > </instrumentation></manifest>看下我们的测试代码效果图:好了,此时我们已经可以获取到服务端的数据,并且接收到客户端并做处理在上一篇文章中,已经实现了对网络数据的获取和处理封装,这篇文章来讲下如何嵌入到安卓应用中。先看下效果图:从上面两图我们可以发现,这个聊天布局其实就是一个ListView,只不过它和传统的ListView有些区别,因为它使用了多Item样式布局首先,先来分
25、析下基础布局:这个界面是由3个布局文件组成,分别是主布局,发送消息样式布局,接收消息样式布局先来看下主布局:这里是对应的主布局代码:android:divider="null"-去除ListView的Item分割线<RelativeLayout xmlns:android="schemas.android./apk/res/android" xmlns:tools="schemas.android./tools" android:layout_width="match_parent" android:layo
26、ut_height="match_parent" android:background="drawable/chat_bg_default" > <LinearLayout android:id="+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:backgro
27、und="drawable/title_bar" android:gravity="center" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="center" android:text="机器兔" android:
28、textColor="android:color/white" android:textSize="20sp" /> </LinearLayout> <RelativeLayout android:id="+id/bottom" android:layout_width="fill_parent" android:layout_height="55dp" android:layout_alignParentBottom="true" android:b
29、ackground="drawable/bottom_bar" android:padding="5dp" > <EditText android:id="+id/send_message" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertica
30、l="true" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:background="drawable/login_edit_normal" /> <Button android:id="+id/send_bt" android:layout_width="wrap_content" android:layout_height="fill_parent&
31、quot; android:layout_alignParentRight="true" android:layout_alignRight="id/send_message" android:background="drawable/send_button_selector" android:gravity="center_vertical" android:text="发送" /> </RelativeLayout> <ListView android:id=&quo
32、t;+id/chatlistview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="id/bottom" android:layout_below="id/title" android:divider="null" > </ListView></RelativeLayout>再来看下消息布局:(由于消息布局只是左右两
33、边方向的不同,这里只给出其中一个)这是2个消息布局的代码:<"xml version="1.0" encoding="utf-8"><LinearLayout xmlns:android="schemas.android./apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical
34、" > <TextView android:id="+id/sendtime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="*999999" android:text="2014-11-07 18:00" android:textColor="
35、;android:color/white" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"
36、 android:orientation="vertical" > <!- 头像昵称部分 -> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:src="drawable/icon1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_conte
37、nt" android:layout_gravity="center" android:text="机器兔" /> </LinearLayout> <TextView android:id="+id/sendmsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="drawable/chatfrom_bg_norma
38、l" android:text="你好,我是机器兔。" /> </LinearLayout></LinearLayout><"xml version="1.0" encoding="utf-8"><LinearLayout xmlns:android="schemas.android./apk/res/android" android:layout_width="match_parent" android:layout_heig
39、ht="match_parent" android:orientation="vertical" > <TextView android:id="+id/receivetime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="*999999"
40、android:text="2014-11-07 18:00" android:textColor="android:color/white" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="right" android:orientation="horizontal" > <TextVie
41、w android:id="+id/receivemsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="drawable/chatto_bg_normal" android:text="你好,我是机器兔。" android:textColor="android:color/black" /> <LinearLayout an
42、droid:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <!- 头像昵称部分 -> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:src="drawable/icon" /> <Text
43、View android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="我" /> </LinearLayout> </LinearLayout></LinearLayout>接下来看下关于ListView的自定义适配器,和往常一样自定义适配器需要继承BaseAdapter,并实现一些必须的方法这里有个
44、需要注意的是,因为传统的ListView是统一一个样式的,而这里的聊天布局是左右两边收发信息多Item样式所以需要额外的多覆写2个方法:1、getViewTypeCount-返回样式的种类数目2、getItemViewType -给定类型标示符,便于在回调函数getView时让系统知道我们需要显示的哪个样式代码里还提到了ViewHolder,这个是优化ListView加载速度的一种方法,关于这个知识点我整理一篇笔记安卓开发笔记ListView加载性能优化ViewHolder出来,不熟悉的朋友可以看看。package .example.androidchat;import java.
45、text.SimpleDateFormat;import java.util.List;import .example.pojo.Msg;import .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
46、适配器 * */public class ChatAdapter extends BaseAdapter private List<Msg> data; private LayoutInflater inflater;/ 布局工厂,可以把res/layout的xml布局文件转换成view对象 public ChatAdapter(Context context, List<Msg> data) inflater = LayoutInflater.from(context); this.data = data; Override public int getCount()
47、 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
48、 (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 = (Text
49、View) 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.se
50、tTag(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; /
51、* * 由于此处我们要返回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主线程去操
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024科技公司与医疗机构之间关于医疗设备研发与销售合同
- 2025年度厂房办公室装修项目噪音控制合同范本4篇
- 个体经营者与员工2024年劳动协议样式版B版
- 花烟草养护知识培训课件
- 2024跨国企业人力资源外包管理合同
- 2024版货物运输安全合同书
- 2025年度园林景区草坪修剪与生态修复合同3篇
- 2024年03月广东届兴业银行深圳分行线上校招笔试历年参考题库附带答案详解
- 2025年度城市综合体户外广告位及摊位联合租赁及品牌推广合同4篇
- 2025年拆除工程环境影响评价合同4篇
- 中医诊疗规范
- 报建协议书模板
- 第14课《叶圣陶先生二三事》导学案 统编版语文七年级下册
- 汽车配件购销合同范文
- 贵州省2024年中考英语真题(含答案)
- 施工项目平移合同范本
- 北师大版八年级上册数学期中综合测试卷(含答案解析)
- 幼儿园创意美劳培训
- 同济大学第四版线性代数课后习题答案
- 医疗领域人工智能技术应用的伦理与法规
- 工地春节停工复工计划安排
评论
0/150
提交评论