Android Studio实现智能聊天机器人

项目目录

  • 一、需求分析
    • 1、业务需求分析
    • 2、模型需求分析
    • 3、界面需求分析
  • 二、开发环境
  • 三、聊天功能业务实现
    • 1、✨申请机器人身份标识
    • 2、搭建聊天界面布局
    • 3、搭建聊天条目布局
    • 4、封装聊天信息实体类
    • 5、编写聊天列表适配器
    • 6、实现智能机器人通信
  • 四、项目效果
  • 五、项目总结
  • 六、源码下载

一、需求分析

1、业务需求分析

在这里插入图片描述

2、模型需求分析

在这里插入图片描述

3、界面需求分析

在这里插入图片描述

二、开发环境

在这里插入图片描述

三、聊天功能业务实现

大家先按照下面的步骤到图灵机器人官网申请一个属于自己的图灵机器人,可以自定义设置词库和语料库。

1、✨申请机器人身份标识

在这里插入图片描述
创建完之后就像我这样,这里我免费申请了两个机器人,并且设置了下机器人信息。
在这里插入图片描述
设置一下机器人的私有语料库,也就是让机器人用特定的话语回复你特定的问题,就像我下面的设置这样。
在这里插入图片描述
在右边的聊天窗口,我们可以测试自己设置的语料库,看看机器人回复效果。
在这里插入图片描述
在【技能扩展】中开启这些选项,会让机器人回复的更加生动有趣。
在这里插入图片描述

在Utils包下的HttpUtils类中定义了字符串常量,其中我们需要替换的就是ROBOT_APIKEY,一定要按照上面自己申请个key,公用的key会没有使用次数。

在这里插入图片描述

2、搭建聊天界面布局

在这里插入图片描述
整个界面最外层采用线性布局,在最大的LinearLayout中先设置了一个TextView用来显示聊天窗口的文本为机器人。

接着在TextView下面放置了一个RelativeLayout,在它里面先放置了一个ListView,用于显示聊天消息列表。

然后放置了一个小的RelativeLayout,里面放置了一个Button和一个EditText,Button在EditText右侧,文本为“发送”,作为发送按钮,EditText则是聊天输入框,在里面输入聊天内容。

这样整个聊天界面的布局文件就搭建好了。如图所示:
在这里插入图片描述
activity_main的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="45dp"android:gravity="center"android:background="#0cc4e5"android:text="机器人"android:textColor="@android:color/white"android:textSize="20sp"/><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"><ListViewandroid:id="@+id/list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_above="@+id/rl_bottom"android:cacheColorHint="@android:color/black"android:divider="@null"android:listSelector="@null"android:transcriptMode="alwaysScroll"/><RelativeLayoutandroid:id="@+id/rl_bottom"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@drawable/bottom_bg"><Buttonandroid:id="@+id/btn_send"android:layout_width="60dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="10dp"android:background="@drawable/btn_send_selector"android:text="发送"android:textColor="@android:color/black"android:textSize="14sp"/><EditTextandroid:id="@+id/et_send_msg"android:layout_width="fill_parent"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_toLeftOf="@+id/btn_send"android:background="@drawable/send_msg_bg"android:singleLine="true"android:textColor="@android:color/black"android:textSize="18sp"/></RelativeLayout></RelativeLayout>
</LinearLayout>

3、搭建聊天条目布局

在这里插入图片描述
chatting_left_item文件为机器人聊天头像和聊天框显示文件,用于显示机器人的聊天内容。

主要是在RelativeLayout中放置了一个ImageView和一个TextView,ImageView为机器人的头像图片robot_head,TextView 中的 style 设置为 style 文件夹中写好的格式文件 chat_content_style , background选择drawable中的chat_left_selector【鼠标选中消息,背景显示为深绿色,默认显示为绿色】。效果如图:
在这里插入图片描述
chatting_left_item代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="6dp"><ImageViewandroid:id="@+id/iv_head"android:layout_width="65dp"android:layout_height="65dp"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginTop="5dp"android:background="@drawable/robot_head"android:focusable="false"/><TextViewandroid:id="@+id/tv_chat_content"style="@style/chat_content_style"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_toRightOf="@+id/iv_head"android:background="@drawable/chat_left_selector" />
</RelativeLayout>

chatting_right_item文件为用户聊天头像和聊天框显示文件,用于显示用户的聊天内容。

和机器人的聊天条目相同。主要是在RelativeLayout中放置了一个ImageView和一个TextView,ImageView 为用户的头像图片 myhead ,TextView中的 style 为 style 中 chat_content_style ,
background选择drawable中的chat_right_selector【鼠标选中消息,背景显示为灰色,默认显示为白色】。效果如图:
在这里插入图片描述
chatting_right_item代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:padding="6dp"><ImageViewandroid:id="@+id/iv_head"android:layout_width="65dp"android:layout_height="65dp"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:layout_marginTop="5dp"android:background="@drawable/myhead"android:focusable="false"/><TextViewandroid:id="@+id/tv_chat_content"style="@style/chat_content_style"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="5dp"android:layout_toLeftOf="@+id/iv_head"android:background="@drawable/chat_right_selector"/></RelativeLayout>

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控件进行数据适配。所以要创建一个ChatAdapter类。

getView方法内用if和else语句判断当前的消息是发送的消息还是接收到的消息,不同消息加载不同的view。如果是接收消息,说明就是机器人发的消息,那就加载左边布局;如果是发送消息,说明就是用户发的消息,则加载右边布局。

@Overridepublic 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><item>今天天气超级好,我心情也很愉快哦。</item><item>小主人,一起散步嘛。</item></string-array>
</resources>

2、发送网络请求

在HttpUtils类中定义了submitPostData(String strUrlPath, String text)方法,用来从服务器请求数据,dealResponseResult方法是将输入流中的字节转换为字符串。

public String dealResponseResult(InputStream inputStream) {String resultData = null; // 处理后的字符串ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] data = new byte[1024];// 字节数组int len = 0;try {while((len = inputStream.read(data)) != -1) {byteArrayOutputStream.write(data, 0, len);}} catch (IOException e) {e.printStackTrace();}resultData = new String(byteArrayOutputStream.toByteArray());return resultData;
}

3、显示用户发送消息

用户发送首先获取输入的信息,进行判空操作,然后清空消息框,将发送的信息添加到数据源列表中,通知适配器更新ListView列表,再从服务器获取机器人回复的信息。

 private void sendData(){// 获取你输入的信息sendMsg = et_send_msg.getText().toString();// 判断消息是否为空if(TextUtils.isEmpty(sendMsg)){Toast.makeText(this,"您还未输入信息哦",Toast.LENGTH_LONG).show();return;}// 清空消息框et_send_msg.setText("");// 替换空格和换行sendMsg = sendMsg.replaceAll(" ","").replaceAll("\n","").trim();ChatBean chatBean = new ChatBean();chatBean.setMessage(sendMsg);// SEND表示自己发送的信息chatBean.setState(chatBean.SEND);// 将发送的信息添加到数据源列表中chatBeanList.add(chatBean);// 通知适配器更新ListView列表adapter.notifyDataSetChanged();// 从服务器获取机器人回复的信息getDataFromServer();}

4、显示机器人的回复消息

网络请求千万不能放在主线程,更新UI不能在子线程,所以拿到请求到的数据后,进行解析,这里不需要对JSON对象解析,通过字符串操作拿到text和code,然后通过updateView显示在列表中。

private void getDataFromServer() {// 子线程进行网络请求new Thread(new Runnable() {@Overridepublic void run() {result = httpUtils.submitPostData(HttpUtils.TURING_WEBSITE, sendMsg);Log.v(TAG, result);if (TextUtils.isEmpty(result) || result.contains("请求次数超限制!")) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "无网络或请求次数超限制!", Toast.LENGTH_SHORT).show();}});} else {// 获取的textgetData = result.substring(result.indexOf("{\"text\"") + 9, result.indexOf("}}]}") - 1);// 获取的codecode = result.substring(result.indexOf("\"code\"") + 7, result.indexOf(",\"operateState\""));// UI线程更新数据源和通知适配器更新列表runOnUiThread(new Runnable() {@Overridepublic void run() {updateView(Integer.parseInt(code), getData);}});}}}).start();}

四、项目效果

Android Studio实现智能聊天机器人

五、项目总结

在本项目的实现过程中,熟悉了Http网络请求、JSON解析、Handler处理等知识点,这些知识点会在后来Android项目中经常使用,因此希望读者可以按照步骤完成此项目,通过熟练掌握本项目中的这些知识点,方便以后开发其他项目。

六、源码下载

以下两种方式都可以获取源代码:

直接点击下方链接下载源代码
Android Studio实现智能聊天机器人
关注公众号《 萌新加油站 》,后台回复: 聊天机器人
在这里插入图片描述

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

你遇见了什么人,什么时候找到一份工作,在哪里做了什么事,是努力还是堕落,事到如今,你回头想想,这些其实都是你对自己的安排。所有的昨日,才有了你所有的今日。 ​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/49070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android智能聊天机器人

苹果有Siri,百度有小度&#xff0c;小米有小爱&#xff0c;而且后来竟然又出了个小兵&#xff0c;总之类似的智能聊天机器人是越来越多了。面对这样智能的机器人&#xff0c;我们似乎只能是体验者。想想底层的算法就让人头疼&#xff0c;它到底是怎么识别出一句话的意思的&…

德国IT行业薪酬水平大揭秘--2020

点击 欧盟IT那些事 关注我们 公告&#xff1a;因企鹅审核规定&#xff0c;本公众号从《德国IT那些事》更名为《欧盟IT那些事》。 所有脱离工龄、级别、职位、经验、城市以及裙带关系来谈论工资&#xff0c;都是耍流氓&#xff01; 一般来说IT行业公司&#xff0c;资历是按等级划…

德国IT行业薪酬水平大揭秘--2023

点击 欧盟IT那些事 关注我们 公告&#xff1a;因企鹅审核规定&#xff0c;本公众号从《德国IT那些事》更名为《欧盟IT那些事》。 所有脱离工龄、级别、职位、经验、城市以及裙带关系来谈论工资&#xff0c;都是耍流氓&#xff01;2022-23年&#xff0c;SAP行业薪酬异军突起&…

当事务Transactional遇见异步线程出现的坑

问题 开发小伙伴遇到线上环境消息推送不成功&#xff0c;排查日志发现推送是id为null 代码示例 Transactional(rollbackFor Exception.class) public void register(UserDTO dto) {User user BeanCopyUtils.copyBean(dto, User.class);insert(user);//注册成功消息推送exe…

511遇见电脑PC任意多开绿色软件

电脑端的微信只能单开&#xff0c;为了工作方便需要&#xff0c;我们有时候需要开启多个微信账号&#xff0c;511遇见制作一个微信多开端。 微信vx多开器特点 1.支持自动获取电脑上的微信安装路径 2.支持手动获取微信安装路径 3.支持所有版本的微信多开 4.支持自定义任意多开数…

当互联网码农遇见国企老同学

本文转载自程序员技术 码农张小北和国企职员王志强&#xff0c; 是同一所大学、同一个专业、同一间宿舍&#xff0c; 睡上下铺的兄弟。 毕业那年&#xff0c; 性格沉闷的张小北去了互联网公司&#xff0c; 善于处事的王志强选择了一家国企。 两个不同的选择&#xff0c; 在…

抖音直播带货数据统计,直播带货要复盘哪些数据指标

抖音直播电商数据分析需要围绕“带货”这个核心目标展开,这其中就涉及到“人、货、场”这三个概念,也就是抖音直播的流量、商品和直播间。 这三个概念组合起来,就是抖音直播电商需要关注的核心问题,也是我们数据分析的重点: 1. 不同商品适合在什么类型的直播间推广? 商品在…

带货直播系统,实现直播重要的一步——推流

什么是rtmp&#xff1f; RTMP是Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;的首字母缩写。该协议基于TCP&#xff0c;是一个协议族&#xff0c;包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议&…

虚拟主播也带货?直播电商的变与不变

5月6日晚&#xff0c;海外虚拟主播vox在B站开启了中国直播首秀。从最终数据来看&#xff0c;直播1.7小时&#xff0c;营收111万人民币&#xff0c;当晚还登上平台热门首位&#xff0c;这样的直播吸金能力&#xff0c;让不少明星都望尘莫及。 更值得关注的是&#xff0c;直播间…

直播带货行业如何入局?先了解一下直播商城源码吧

直播行业的爆火已经持续了多个年头&#xff0c;直到今天&#xff0c;在人们的生活中依然有着举足轻重的地位&#xff0c;它通过多元化的方案为许多行业带来了新的思路&#xff0c;特别是与传统商业所结合的“直播电商”、“直播商城”的卖货新形式&#xff0c;让多方因此而受益…

抖音直播带货数据统计,抖音直播带货复盘必看的4个数据

在每一次抖音直播结束后&#xff0c;都会将这一场数据呈现给我们&#xff0c;而我们要对数据进行分析总结。很多人在分析数据的时候&#xff0c;不知道要分析哪些数据&#xff0c;其实我们在复盘的时候&#xff0c;一定要注意这4个数据&#xff0c;这四个数据可以很全面的反应直…

直播前、直播中、直播后...直播带货技巧大盘点

直播带货已经成为2020年商家营销的一个必要渠道&#xff0c;随着移动互联网发展日益壮大&#xff0c;全国各大行业基本上已经普及了网络化&#xff0c;直播行业已经成为炙手可热的话题。 “万物皆可直播”这是前段时间网上盛传的一句话&#xff0c;是啊&#xff0c;万物皆可直…

直播带货系统,实现直播间人数统计

实现直播带货系统直播间的上下滚动人数计数器&#xff1a; css&#xff1a; .sdvm_num{! font-size: 14px;color:red;display:inline-block;vertical-align:middle;margin-left:8px;} .sdvm_num i{width:70px;height:52px;display:inline-block;background:url(../images/num…

直播带货app源码,实现直播连麦和PK

一、概述 连麦&#xff1a;是指直播带货app源码中&#xff0c;由观众向主播发起连线请求&#xff0c;在主播和该观众之间建立低延迟的通讯链路&#xff0c;而其他观众可以看到“主播连麦观众”的合成音视频内容。PK&#xff1a;是指直播过程中&#xff0c;由主播发起&#xff…

DBS的组成、DBS的全局结构、DBS结构的分类

概述&#xff1a;这在知识体系中都是目录式的知识&#xff0c;把它整理出来&#xff0c;形成图即可。

DB,DBMS,DBS之间的关系

数据库(Database,简称DB)是指&#xff1a;长期储存在计算机内的、有组织的、可共享的大量数据集合。一个应用系统通常包含多个数据库。 数据库管理系统&#xff08;Database Management System&#xff0c;简称DBMS&#xff09;是位于用户&#xff08;应用程序&#xff09;与操…

DBS小结

《数据库系统原理》主要介绍的是数据库技术的基本原理、方法和应用技术。 它可以使我们能有效地使用现有的数据库管理系统和软件开发工具&#xff0c;掌握数据库结构的设计和数据库应用系统的开发原理。 在这里&#xff0c;将这本书分为概念部分、方法部分和应用技术部分。

实战案例丨GaussDB for DWS如何识别坏味道的SQL

摘要&#xff1a;SQL中的坏味道&#xff0c;你知道吗&#xff1f; SQL语言是关系型数据库&#xff08;RDB&#xff09;的标准语言&#xff0c;其作用是将使用者的意图翻译成数据库能够理解的语言来执行。人类之间进行交流时&#xff0c;同样的意思用不同的措辞会产生不同的效果…

GBase 8s 数据库监控(4)

5&#xff0e;Session 的连接情况 通过 Session 的连接信息&#xff0c;可以分析出数据库系统业务的负载情况以及来自哪些客户端的任务较多&#xff0c;并且根据 Session 的空闲情况判断客户端连接池是否存在过多的连接。查询 Session 连接情况的 SQL 语句如下。 SELECT s.sid…

一篇就够了-带你走进DB2分区

目录 先决条件&#xff1a; DB2数据库分区 1、概念描述 2、DPF对数据库性能产生的影响 3、DB2分区与Oracle的比较 4、总结 进入正文&#xff1a; 简介 特性概述 三个互补的 CREATE TABLE 选项 简要对比 互补特性 表设计 表设计的经验法则 设计的例子 再添上 MQ…