基于Android的智能聊天机器人的设计与实现文档格式.docx
《基于Android的智能聊天机器人的设计与实现文档格式.docx》由会员分享,可在线阅读,更多相关《基于Android的智能聊天机器人的设计与实现文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
+INFO;
HttpGetrequest=newHttpGet(requesturl);
HttpResponseresponse=HttpClients.createDefault().execute(request);
//200即正确的返回码
if(response.getStatusLine().getStatusCode()==200){
Stringresult=EntityUtils.toString(response.getEntity());
System.out.println("
返回结果:
"
+result);
}
}
好了,接下来开始实战吧,这个应用我打算写成两篇文章
第一篇讲下关于如何调用接口,从网上获取数据,包括解析Json字符串
第二篇会把这些获取的数据嵌入到安卓应用
首先,先写一个工具类,这个工具类是用来获取用户输入的信息并返回服务器提供的数据的
这里面用到了一个第三方提供的JAR包,Gson它是谷歌提供给我们用来使Json数据序列化和反序列化的
关于Gson的使用我之前写过一篇笔记,不熟悉的朋友可以看看:
Gson简要使用笔记(.cnblogs./lichenwei/p/3987429.html)
代码如下:
具体看注释
package.example.utils;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.UnsupportedEncodingException;
import.HttpURLConnection;
import.MalformedURLException;
import.URLEncoder;
importjava.util.Date;
importandroid.util.Log;
import.example.pojo.Message;
import.example.pojo.Message.Type;
import.example.pojo.Result;
import.google.gson.Gson;
/**
*
*获取信息帮助类传入用户输入的字符,给出相对应的信息
*/
publicclassGetDataUtils{
privatestaticfinalStringAPI_KEY="
这里填写官方提供的KEY"
;
//申请的API_KEY值
privatestaticfinalStringURL="
.tuling123./openapi/api"
//接口请求地址
publicStringgetChat(Stringmsg){//这个方法是获取服务端返回回来的Json数据,msg为用户输入的信息
Stringresult="
//存放服务器返回信息的变量
InputStreaminputStream=null;
ByteArrayOutputStreamoutputStream=null;
try{
//进行资源请求
.URLurl=new.URL(getMsgUrl(msg));
HttpURLConnectionhttpURLConnection=(HttpURLConnection)url
.openConnection();
//打开资源连接
//HttpURLConnection参数设定
httpURLConnection.setReadTimeout(5*1000);
httpURLConnection.setConnectTimeout(5*1000);
httpURLConnection.setRequestMethod("
GET"
inputStream=httpURLConnection.getInputStream();
//获取一个输入流接收服务端返回的信息
intlen=-1;
byte[]bs=newbyte[124];
//用来接收输入流的字节数组
outputStream=newByteArrayOutputStream();
//用一个输出流来输出刚获取的输入流所得到的信息
while((len=inputStream.read(bs))!
=-1){//从输入流中读取一定数量的字节,并将其存储在缓冲区数组
//bs中
outputStream.write(bs,0,len);
//往输入流写入
}
outputStream.flush();
//清除缓冲区
result=newString(outputStream.toByteArray());
//转换成字符串
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
}finally{
//关闭相关资源
if(inputStream!
=null){
inputStream.close();
if(outputStream!
outputStream.close();
Log.i("
tuzi"
result:
+result);
//打印测试日志
returnresult;
privateStringgetMsgUrl(Stringmsg)throwsUnsupportedEncodingException{
Stringpath="
Stringinfo=URLEncoder.encode(msg,"
UTF-8"
//转换url编码
path=URL+"
?
key="
+API_KEY+"
&
+msg;
returnpath;
publicMessagegetInfo(Stringmsg){
Messagemessage=newMessage();
Gsongson=newGson();
Resultresult=gson.fromJson(getChat(msg),Result.class);
//获取到服务器返回的json并转换为Result对象,Result对象可能不存在,会出现异常
message.setMsg(result.getText());
//message可能为空,需要捕获异常
}catch(Exceptione){
//可能服务器没有返回正常数据,也就存在着空白容,需要捕获异常
message.setMsg("
服务器繁忙,请稍后再试"
message.setTime(newDate());
message.setType(Type.INCOME);
returnmessage;
}
下面这2个是实体类,根据官网提供的示例,返回的Json字符串里包含:
code状态码,text文本容
package.example.pojo;
*用来映射返回Json字符串
*
publicclassResult{
privateStringcode;
privateStringtext;
publicStringgetCode(){
returncode;
publicvoidsetCode(Stringcode){
this.code=code;
publicStringgetText(){
returntext;
publicvoidsetText(Stringtext){
this.text=text;
publicclassMessage{
privateStringname;
privateStringmsg;
privateDatetime;
privateTypetype;
publicenumType{//类型枚举,发送,接收
INCOME,OUTCOME
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicStringgetMsg(){
returnmsg;
publicvoidsetMsg(Stringmsg){
this.msg=msg;
publicDategetTime(){
returntime;
publicvoidsetTime(Datetime){
this.time=time;
publicTypegetType(){
returntype;
publicvoidsetType(Typetype){
this.type=type;
编写个测试类
package.example.test;
importandroid.test.AndroidTestCase;
import.example.utils.GetDataUtils;
publicclassGetDataUtilsTestextendsAndroidTestCase{
publicvoidtest(){
GetDataUtilsdataUtils=newGetDataUtils();
Messagemessage=dataUtils.getInfo("
你好"
Messagemessage1=dataUtils.getInfo("
你是谁"
Messagemessage2=dataUtils.getInfo("
你知道JAVA是什么吗"
Messagemessage3=dataUtils.getInfo("
下雨了,天好冷"
兔子"
message.getMsg());
message1.getMsg());
message2.getMsg());
message3.getMsg());
在JAVAWEB里编写测试单元用到的是Junit,需要导入jar包,在安卓开发里也有类似这样的步骤
首先我们要在AndroidManifest.xml里的application标签里添加
<
uses-libraryandroid:
name="
android.test.runner"
/>
然后在application外添加
<
instrumentationandroid:
android.test.InstrumentationTestRunner"
android:
label="
ceshi"
targetPackage="
.example.androidchat"
>
/instrumentation>
由于需要联网别忘了给应用赋予网络权限
uses-permissionandroid:
android.permission.INTERNET"
这里是完整文件代码:
xmlversion="
1.0"
encoding="
>
manifestxmlns:
android="
http:
//schemas.android./apk/res/android"
package="
versionCode="
1"
versionName="
uses-sdk
minSdkVersion="
8"
targetSdkVersion="
21"
application
allowBackup="
true"
icon="
@drawable/ic_launcher"
@string/app_name"
theme="
@style/AppTheme"
activity
.MainActivity"
intent-filter>
actionandroid:
android.intent.action.MAIN"
categoryandroid:
android.intent.category.LAUNCHER"
/intent-filter>
/activity>
/application>
instrumentation
/manifest>
看下我们的测试代码效果图:
好了,此时我们已经可以获取到服务端的数据,并且接收到客户端并做处理
在上一篇文章中,已经实现了对网络数据的获取和处理封装,这篇文章来讲下如何嵌入到安卓应用中。
先看下效果图:
从上面两图我们可以发现,这个聊天布局其实就是一个ListView,只不过它和传统的ListView有些区别,因为它使用了多Item样式布局
首先,先来分析下基础布局:
这个界面是由3个布局文件组成,分别是主布局,发送消息样式布局,接收消息样式布局
先来看下主布局:
这里是对应的主布局代码:
android:
divider="
@null"
--去除ListView的Item分割线
RelativeLayoutxmlns:
xmlns:
tools="
//schemas.android./tools"
layout_width="
match_parent"
layout_height="
background="
@drawable/chat_bg_default"
LinearLayout
id="
@+id/title"
fill_parent"
wrap_content"
layout_alignParentTop="
@drawable/title_bar"
gravity="
center"
orientation="
vertical"
TextView
layout_gravity="
text="
机器兔"
textColor="
@android:
color/white"
textSize="
20sp"
/LinearLayout>
RelativeLayout
@+id/bottom"
55dp"
layout_alignParentBottom="
@drawable/bottom_bar"
padding="
5dp"
EditText
@+id/send_message"
layout_alignParentLeft="
layout_centerVertical="
layout_marginLeft="
layout_marginRight="
@drawable/login_edit_normal"
Button
@+id/send_bt"
layout_alignParentRight="
layout_alignRight="
@id/send_message"
@drawable/send_button_selector"
center_vertical"
发送"
/RelativeLayout>
ListView
@+id/chatlistview"
layout_above="
@id/bottom"
layout_below="
@id/title"
/ListView>
再来看下消息布局:
(由于消息布局只是左右两边方向的不同,这里只给出其中一个)
这是2个消息布局的代码:
LinearLayoutxmlns:
@+id/sendtime"
#999999"
2014-11-0718:
00"
layout_wid