项目目录
一、需求分析
1、业务需求分析
当你工作比较疲惫时,想看一些笑话或者故事娱乐一下吗?为了更好地调节心情提高生活质量,我们开发了一款基于Android系统的智能聊天机器人,它能够与用户智能对话。如此智能的效果,涉及到对用户语义理解,以及对海量信息的精准搜索和分析,这点我们短时间无法做到,但是我们有幸能够调用第三方公司提供的开放API。
2、模型需求分析
3、界面需求分析
二、项目概述
综合运用SQLite数据库、HttpURLConnection、ListView、GSON、SharedPreferences等技术开发一款智能聊天机器人应用。打开应用,进入欢迎页面,3s后跳转到登录页面。先注册账号,系统会检验账号是否已注册,注册成功后会将账号信息插入到用户表中,接着会跳转至登录页面,并且自动填充账号和密码。如果勾选了记住密码并且成功登录,那么下次打开应用就会自动填充账号和密码。登录成功进入主页面,机器人会随机选择一句欢迎语,在下方输入框中我们可以输入信息进行发送,机器人会根据我们的消息进行智能回复。总体而言,智能聊天机器人是一款趣味性和实用性都很强的App,在设计和开发过程中会牢牢掌握安卓数据库、网络请求等技术。
三、开发环境
四、详细设计
1、申请API
1、先到【天聚数行】官网注册账号登录,然后进行实名认证。
2、在顶部搜索框中输入“机器人”回车,出现下面的结果,选择“天行机器人
”,然后选择“申请接口
”。天行机器人接口目前是免费的,每天可以免费调用100次(机器人成功回复你1条消息就记为1次),对于日常学习而言绰绰有余。
3、点击右上角“控制台
”,然后选择“数据管理
”:
- 在“
我的秘钥KEY
”中可以看到自己的KEY值,这个就是数据源的关键。 - 在
“我的免费接口”
中可以看到今日剩余次数和接口状态等信息,还可以查看详情和调试等。
4、在Utils包下的HttpUtils类中我们定义了字符串常量API_KEY
,将刚刚申请的API KEY复制粘贴进来就可以了。记住,一定要按照上面的步骤申请KEY,否则没有数据返回。
天行机器人支持私有词库批量导入导出、对话管理、默认回复管理及开启或关闭机器人三十多项能力。在控制台设置机器人身份属性后,可以通过向机器人发送指令“robot”快速查看配置效果。请在控制台 - 人机管理中设置机器人身份信息,否则部分变量会直接返回代码。
2、绘制聊天主界面
整个界面最外层采用线性布局,在最大的LinearLayout中先设置了一个TextView用来显示聊天窗口的文本为机器人。接着在TextView下面放置了一个RelativeLayout,在它里面先放置了一个ListView,用于显示聊天消息列表。然后放置了一个小的RelativeLayout,里面放置了一个Button和一个EditText,Button在EditText右侧,文本为“发送”,作为发送按钮,EditText则是聊天输入框,在里面输入聊天内容。这样整个聊天界面的布局文件就搭建好了。如下图所示:
3、绘制聊天主界面item
chatting_left_item为机器人聊天头像和聊天框显示的布局文件。主要是在RelativeLayout中放置了一个ImageView和一个TextView,ImageView为机器人的头像图片bg_robot,TextView中的style设置为style文件夹中写好的格式文件chat_content_style,background选择drawable中的chat_left_selector(鼠标选中消息,背景显示为深绿色,默认显示为绿色)。效果如下图所示:
chatting_right_item为用户聊天头像和聊天框显示的布局文件。主要是在RelativeLayout中放置了一个ImageView和一个TextView,ImageView 为用户的头像图片bg_user ,TextView中的style为style中的chat_content_style,background选择drawable中的chat_right_selector(鼠标选中消息,背景显示为灰色,默认显示为白色)。效果如下图所示:
4、封装聊天消息实体类
在ChatBean类中创建机器人与用户聊天消息的属性,并且定义了get和set方法,消息的状态设为state,如果是发送的消息,state值设为1;如果是接受的消息,state值设为2。
public class ChatBean {
public static final int SEND=1;//发送消息
public static final int RECEIVE=2;//接收消息
private int state;//消息的状态(是接收还是发送)
private String message;//消息的内容
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
5、编写聊天列表适配器
由于聊天界面用了ListView控件显示聊天信息,因此需要创建一个数据适配器ChatAdapter对ListView控件进行数据适配,适配器和列表形影不离,决定列表中各个子项的排列样式。getView
方法内用if和else语句判断当前的消息是发送的消息还是接收到的消息,不同消息加载不同的view。如果是接收消息,说明就是机器人发的消息,那就加载左边布局;如果是发送消息,说明就是用户发的消息,则加载右边布局。
@Override
public View getView(int position, View contentView, ViewGroup viewGroup) {
Holder holder = new Holder();
//判断当前信息是发送信息还是接收信息,根据不同信息加载不同布局文件
if (chatBeanList.get(position).getState() == ChatBean.RECEIVE) {
//加载机器人对应的布局文件
contentView = layoutInflater.inflate(R.layout.chatting_left_item, null);
} else {
//加载用户对应的布局文件
contentView = layoutInflater.inflate(R.layout.chatting_right_item,null);
}
//获取聊天内容控件,并设置控件的文本信息
holder.tv_chat_content = (TextView) contentView.findViewById(R.id. tv_chat_content);
holder.tv_chat_content.setText(chatBeanList.get(position).getMessage());
return contentView;
}
6、编写聊天逻辑
(1)随机欢迎语
机器人随机发出一些欢迎信息放在res/values文件夹中的strings.xml文件中。
<resources>
<string name="app_name">聊天机器人</string>
<string-array name="welcome">
<item>你好!我是你们的新朋友,一个随时准备帮助解答问题的聊天机器人。</item>
<item>欢迎来到这个神奇的世界,我是你们的专属向导,一个能够提供信息、解决疑惑的聊天机器人。</item>
<item>嘿,各位!感谢选择与我交流。我是一个聪明、机智的聊天机器人,专门设计成能够理解和回应各种问题。</item>
<item>欢迎光临!我是一个热情的聊天机器人,随时准备为你们提供帮助和支持,尽力满足你们的需求。</item>
<item>大家好!我是一个充满智慧的聊天机器人,致力于为你们带来愉快的交流体验。请随时向我提问,我会尽力给出清晰、准确的回答。</item>
</string-array>
</resources>
(2)发起网络请求
在HttpUtils类中定义了submitPostData(String strUrlPath, String question)
方法,方法的目的是向指定的URL路径发送一个POST请求,并将请求体中包含的问题(question
)参数传递给服务器。服务器的响应会被捕获并作为字符串返回。
方法首先尝试建立一个到目标URL的HttpURLConnection
。然后,它设置了一些连接属性,包括连接和读取超时时间(都设置为3000毫秒),以及指示连接将用于输出(即发送数据)的标志。接下来,方法设置了POST请求的一些关键HTTP头信息,包括请求方法为"POST",以及内容类型,这意味着发送的表单数据将以这种格式编码在请求体中。
在请求体的构造中,方法首先创建了一个包含API密钥和问题参数的字符串content
。然后,它将该字符串转换为字节码,并通过outputStream
将其写入到网络连接中。在发送数据之前,调用了flush()
方法来确保所有数据都已经被送到了网络上。之后,outputStream
被关闭,以释放与之关联的资源。
然后,创建了一个InputStream
来从网络连接中读取响应。这个输入流被进一步包装在InputStreamReader
和BufferedReader
中,以便更有效地读取文本数据。最后,使用while
循环,方法逐行读取响应文本,并将其追加到StringBuilder
对象tianapi
中。当没有更多的行可读时,循环结束,tianapi
现在包含了完整的响应。关闭所有相关的流,并返回tianapi
的字符串表示形式作为方法的结果。如果在任何时刻发生了IOException
异常,则会捕获它,打印堆栈跟踪,并返回null
。
public String submitPostData(String strUrlPath, String question) {}
(3)JSON解析并显示
对于用户发送的request,服务器响应并返回JSON格式数据,调用submitPostData()
方法将其转换为JSON字符串数据result。接着通过AS自带JSON FORMAT工具将官网提供的返回样例格式化为一个DataBean
类;再通过Gson
将JSON字符串(result)解析成DataBean类的对象,再依次通过get方法获得状态码和回答内容;最后调用updateView(code, reply)
更新消息列表。
// 解析服务器的返回信息
private void parseData(final String request) {
// 子线程进行网络请求
new Thread(new Runnable() {
@Override
public void run() {
result = httpUtils.submitPostData(HttpUtils.API_WEBSITE, request);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(result)) {
Toast.makeText(MainActivity.this, "模拟器无网络!", Toast.LENGTH_SHORT).show();
} else {
// 通过Gson将JSON字符串(result)解析成DataBean类的实例
DataBean dataBean = new Gson().fromJson(result, DataBean.class);
// 从dataBean对象中提取内部的resultDTO对象
DataBean.ResultDTO resultDTO = dataBean.getResult();
// 状态码
int code = dataBean.getCode();
// 回答内容
String reply = resultDTO.getReply();
// 根据状态码显示相应的提示
updateView(code, reply);
}
}
});
}
}).start();
}
五、运行演示
发送HTTP网络请求需要模拟器连接网络。据我了解,有90%的同学使用Android Studio自带的安卓模拟器无法连接网络。因此我建议使用夜神模拟器,只要电脑有网络,夜神模拟器绝对有网。
Android Studio实现智能聊天机器人
六、源码下载
想要立即拥有这篇文章的源代码?没问题!两种方式任你选:💻直接点击下方CSDN专属下载链接,轻松get√;🎁或者,只需动动手指指关注公众号《萌新加油站》,回复下方关键词即刻解锁!快来探索你的技术宝藏,开启编程新旅程吧!🚀
1️⃣ 点击右侧链接直接下载源码 | Android智能聊天机器人源码 |
---|---|
2️⃣ 点击右侧链接直接下载报告 | Android智能聊天机器人报告 |
3️⃣关注公众号《 萌新加油站 》 | 后台回复:聊天机器人 |
🚀这有你错过的精彩内容 |
---|
Android Studio实现选课系统 |
Android Studio实现外卖订餐系统 |
Android Studio实现考试管理系统 |
Android Studio实现图书馆订座系统 |
Android Studio实现学生信息管理系统 |
衷心希望见到《欲海回狂》这本书的人,把它当作清夜里的钟声,饥荒中的食粮,常放在书案上反复研读。若能由此领悟人生的智慧,福缘自然会变得愈加深厚。至于书中对于生命意义的探寻及对生活哲理的阐释,精辟生动,流光溢彩。