Android Studio实现智能聊天机器人

一、需求分析

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来从网络连接中读取响应。这个输入流被进一步包装在InputStreamReaderBufferedReader中,以便更有效地读取文本数据。最后,使用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实现智能聊天机器人

六、源码下载

1️⃣ 点击右侧链接直接下载源代码Android Studio实现智能聊天机器人
2️⃣关注公众号《萌新加油站》 后台回复:聊天机器人

🚀这有你错过的精彩内容
Android Studio实现选课系统
Android Studio实现外卖订餐系统
Android Studio实现考试管理系统
Android Studio实现图书馆订座系统
Android Studio实现学生信息管理系统

衷心希望见到《欲海回狂》这本书的人,把它当作清夜里的钟声,饥荒中的食粮,常放在书案上反复研读。若能由此领悟人生的智慧,福缘自然会变得愈加深厚。至于书中对于生命意义的探寻及对生活哲理的阐释,精辟生动,流光溢彩。

  • 48
    点赞
  • 314
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

振华OPPO

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值