基于Android studio开发的图灵智能聊天机器人

前言

       在人工智能时代,开发一款自己的智能问答机器人,既可以提升自己的编程能力,又可以作为开发项目的实战练习。

       百度有小度,小米有小爱,VIVO有小V,总之类似的智能聊天机器人是越来越多了。面对这些智能的机器人,我们似乎只能是体验者。想想底层的算法就让人头疼,它到底是怎么识别出一句话的意思的?又是怎么实现智能回复的?

       接下来我将用Android studio并借用百度图灵机器人((turingapi.com))教大家实现一个属于自己的智能聊天机器人。

学  号     231   

 姓  名      福福      

指导教师:赵,罗,钟

  2022  5   8 

1  系统设计

1.1 设计要求

1.1.1 设计任务   

设计一个对话框能实现聊天功能,要求能联网实现自动对话的功能,可以实现编辑、发送、删除等功能。

1.1.2 性能指标要求  

1、基本要求

  要求完成程序源码编写、调试及关键代码注释。

2、发挥部分

实现多客户端间的聊天功能。

1.2 设计思路及设计框图

1.2.1设计思路

智能聊天机器人的设计流程如下:

①将要显示的数据封装成Data数据。

②将封装好的Data数据设置成HTTP请求数据。

③向图灵机器人服务器发送HTTP请求。

④图灵服务器接收到HTTP请求数据之后,返回JSON数据。

⑤将获取到的JSON数据进行解析。

⑥解析后的JSON数据封装并显示到界面中。

1.2.2总体设计框图

 

2  各个模块程序的设计

1、申请机器人身份标识 

在图灵机器人官网注册并获取key值

2、建立聊天布局

整个界面最外层采用线性布局,接着在TextView下面放置了一个RelativeLayout,在它里面先放置了一个ListView,用于显示聊天消息列表。然后放置了一个小的RelativeLayout,里面放置了一个Button和一个EditText,Button在EditText右侧,文本为“发送”,作为发送按钮,EditText则是聊天输入框,在里面输入聊天内容。这样整个聊天界面的布局文件就搭建好了。

<?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:background="#0cc4e5"android:gravity="center"android:text="小福机器人"android:textColor="#795548"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="48dp"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"tools:ignore="SpeakableTextPresentCheck,SpeakableTextPresentCheck,TouchTargetSizeCheck,TouchTargetSizeCheck" /></RelativeLayout></RelativeLayout>
</LinearLayout>

3、搭建聊天条数布局

chatting_left_item文件为机器人聊天头像和聊天框显示文件,用于显示机器人的聊天内容。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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"tools:ignore="SpeakableTextPresentCheck" /></RelativeLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"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"tools:ignore="SpeakableTextPresentCheck" /></RelativeLayout>

4、封装聊天信息实体类

      创建一个ChatBean类,在该类中创建机器人与用户聊天信息的属性重写了get和set方法

package com.example.ffshixun;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、编写聊天列表适配器

   创建一个ChatAdapter类,由于聊天界面用了ListView控件显示聊天信息,因此需要创建一个数据适配器ChatAdapter对ListView控件进行数据适配。

package com.example.ffshixun;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;import zj.dzh.intelrobot.R;public class ChatAdapter extends BaseAdapter {private List<ChatBean> chatBeanList;//聊天数据private LayoutInflater layoutInflater;public ChatAdapter(List<ChatBean>chatBeanList, Context context){this.chatBeanList=chatBeanList;layoutInflater=LayoutInflater.from(context);}@Overridepublic int getCount() {return chatBeanList.size();}@Overridepublic Object getItem(int position) {return chatBeanList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder=new Holder();//判断当前的消息是发送的消息还是接收到的消息,不同消息加载不同的viewif (chatBeanList.get(position).getState()==ChatBean.RECEIVE){//加载左边布局,也就是机器人对应的布局信息convertView=layoutInflater.inflate(R.layout.chatting_left_item,null);}else{//加载右边布局,也就是用户对应的布局信息convertView=layoutInflater.inflate(R.layout.chatting_right_item,null);}holder.tv_chat_content=(TextView)convertView.findViewById(R.id.tv_chat_content);holder.tv_chat_content.setText(chatBeanList.get(position).getMessage());return convertView;}class Holder{public TextView tv_chat_content;//聊天内容}
}

6、实现智能机器人通信

    在项目MainActivity中实现聊天界面的逻辑代码,首先添加okhttp库,然后设置机器人的欢迎信息,最后编写界面交互代码。

package com.example.ffshixun;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telecom.Call;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import zj.dzh.intelrobot.R;public class MainActivity extends AppCompatActivity {private ListView listView;private ChatAdapter adapter;private List<ChatBean> chatBeanList;//存放所有聊天数据的集合private EditText et_send_msg;private Button btn_send;//接口地址private static final String WEB_SITE="http://www.tuling123.com/openapi/api";//唯一key,该key的值是从官网注册账号获取的,注册地址为:http://www.tuling123.com/private static final String KEY="d2001c59d6af4c51b4eff1535fbf81ec";private String sendMsg;//发送的信息private String welcome[];//存储欢迎信息private MHandler mHandler;public static final int MSG_OK=1;//获取数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chatBeanList=new ArrayList<ChatBean>();mHandler=new MHandler();//获取内置的欢迎信息welcome=getResources().getStringArray(R.array.welcome);initView();//初始化界面控件}public void initView(){listView=(ListView)findViewById(R.id.list);et_send_msg=(EditText)findViewById(R.id.et_send_msg);btn_send=(Button)findViewById(R.id.btn_send);adapter=new ChatAdapter(chatBeanList,this);listView.setAdapter(adapter);btn_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {sendData();//点击发送按钮,发送信息}});et_send_msg.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent keyEvent) {if (keyCode==KeyEvent.KEYCODE_ENTER && keyEvent.getAction()==KeyEvent.ACTION_DOWN){sendData();//点击Enter键也可以发送信息}return false;}});int position=(int)(Math.random()*welcome.length-1);//获取一个随机数showData(welcome[position]);//用随机数获取机器人的首次聊天信息}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);chatBean.setState(chatBean.SEND);//SEND表示自己发送的信息chatBeanList.add(chatBean);//将发送的信息添加到chatBeanList集合中adapter.notifyDataSetChanged();//更新ListView列表getDataFromServer();//从服务器获取机器人发送的信息}private void getDataFromServer(){OkHttpClient okHttpClient=new OkHttpClient();Request request =new Request.Builder().url(WEB_SITE+"?key="+KEY+"&info="+sendMsg).build();Call call=okHttpClient.newCall(request);//开启异步线程访问网络call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {String res=response.body().string();Message msg=new Message();msg.what=MSG_OK;msg.obj=res;mHandler.sendMessage(msg);}});}//事件捕获class MHandler extends Handler{@Overridepublic void dispatchMessage(Message msg){super.dispatchMessage(msg);switch(msg.what){case MSG_OK:if(msg.obj!=null){String vlResult=(String)msg.obj;paresData(vlResult);}break;}}}private void paresData(String JsonData){  //Json解析try{JSONObject obj=new JSONObject(JsonData);String content=obj.getString("text");//获取的机器人信息int code=obj.getInt("code");//服务器状态码updateView(code,content);}catch (JSONException e){e.printStackTrace();showData("主人,你的网络不好哦");}}private void showData(String message){ChatBean chatBean=new ChatBean();chatBean.setMessage(message);chatBean.setState(ChatBean.RECEIVE);//机器人发送的消息chatBeanList.add(chatBean);//将机器人发送的消息添加到chatBeanList集合中adapter.notifyDataSetChanged();}private void updateView(int code,String content){//code有很多形状,在此例举几种。switch (code){case 4004:showData("主人,今天我累了,我要休息了,明天再来找我耍吧");break;case 40005:showData("主人,你说的是火星语吗?");break;case 40006:showData("主人,我今天要去约会哦,改天再聊哦。");break;case 40007:showData("主人,明天再和你耍啦,我感冒了,呜呜呜。。。");break;default:showData(content);break;}}protected long exitTime;//记录第一次点击时的时间@Overridepublic boolean onKeyDown(int keyCode,KeyEvent event){if (keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()==KeyEvent.ACTION_DOWN){if ((System.currentTimeMillis()-exitTime)>2000){Toast.makeText(MainActivity.this,"再按一次退出聊天程序",Toast.LENGTH_SHORT).show();exitTime=System.currentTimeMillis();}else {MainActivity.this.finish();System.exit(0);}return true;}return super.onKeyDown(keyCode,event);}private class OkHttpClient {}
}

在MainActivity中创建几个方法:

  1. initView( ) 用于获取界面控件并初始化界面数据;
  2. showData( ) 用于显示欢迎信息到界面上;
  3. sendData ( ) 用于用户发送信息;
  4. getDataFromServer( ) 从服务器获取机器人的回复信息;
  5. updateView( ) 更新界面信息;

3  调试过程

  运行会会有随机的欢迎消息,可以在回复设置里面自定义修改。发英文字母a,b,c,它会自动往下接,实现了单人聊天。

4  功能测试

4.1 测试仪器与设备

    Android studio  笔记本电脑

4.2 性能指标测试

    实现联网自动对话,发送功能,未实现发送、删除等功能。

5  实训心得体会

安卓实训结束了,通过对智能聊天机器人的开发设计,对Android 应用开发有了更为深层次的理解,对手机应用也有了全新的认识于熟练,对基于Android多种布局以及第三方软件API的引用有了更深层次的理解。实训前对android的应用操作还不熟悉,实训结束后终于知道了个步骤操作。本机器人聊天系统基本上实现了需求中的全部功能需求,整体上较为满意。本应用的难点在于如何设置的不同布局,以及跳转,实现聊天的效果。学完后,加深了对布局的理解,为以后开发类似程序打下了基础。但是自己对安卓的很多方面还不是很了解,各种方法也不是很会使用,实训过后自己还会加强对安卓应用设计的学习。

6  参考文献

 [1] 张思民.Android Studio(第二版).北京:清华大学出版社,2017

附录

相关图片

 

 

程序清单

链接:https://pan.baidu.com/s/1yywLy4soGEQ9YNR8PEePtg 
提取码:1314

 

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

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

相关文章

短视频矩阵源码开发部署--开原

短视频矩阵源码是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。在本文中&#xff0c;我们将介绍短视频矩阵的原理和实现&#xff0c;并提供示例代码。 开发链路解析 短视频矩阵系统源码开发链路包括需求分析、技术…

ChatGPT危了!注意力机制的神秘bug曝光!Transformer模型恐大受冲击...

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【Transformer】微信交流群 转载自&#xff1a;新智元 【导读】「注意力公式」存在8年的bug首现&#xff0c;瞬间引爆舆论。爆料者称&#xff0c;基于Transformer架构打造的模…

短视频抖音seo矩阵源码如何搭建开发?

抖音SEO矩阵源码排名逻辑采用一系列算法进行生成&#xff0c;其中包括用户行为、关键词匹配和内容质量等多维度指标的衡量。首先&#xff0c;用户行为是决定视频排名的主要因素&#xff0c;包括点赞数、评论数、观看时长和转发次数等。其次&#xff0c;关键词匹配也是影响排名的…

chatgpt赋能python:使用Python让照片动起来:一种新颖的SEO方法

使用Python让照片动起来&#xff1a;一种新颖的SEO方法 在当今数字时代&#xff0c;社交媒体已经成为营销策略中不可或缺的一部分。人们越来越喜欢以图像的形式来获取信息。然而&#xff0c;在面对大量的图像时&#xff0c;如何让自己的图片和品牌脱颖而出&#xff1f;答案是&…

chatgpt赋能python:PythonWand:用Python实现的ImageMagick工具箱

Python Wand: 用Python实现的ImageMagick工具箱 ImageMagick是一款强大的图像处理工具箱&#xff0c;经常被用于缩放、裁剪和转换图像等任务。Python Wand是对ImageMagick命令行工具的Python封装&#xff0c;使得Python程序员能够使用Python代码来操作图像。 为什么使用Pytho…

短视频如何进行高效制作?元引擎助你一臂之力

在当今社会&#xff0c;视频制作已经成为了一种非常流行和重要的创意方式。越来越多的人开始尝试制作自己的短视频&#xff0c;但是对于很多新手小白来说&#xff0c;短视频制作可能是一项相对困难的任务。但是现在&#xff0c;使用元引擎AI一键生成原创视频系统&#xff0c;可…

Python预测彩票中奖

文章目录[隐藏] python来解答你有生之年可以中双色球 python来解答你有生之年可以中双色球 昨天买了几注双色球开奖了&#xff0c;规划好了中奖后怎么花&#xff0c;紧张又刺激的等待后&#xff0c;狗带…… 到底我们能不能中双色球呢&#xff0c;用Python来验证一下吧&#xf…

基于GPT-4的 IDEA 神仙插件,无需魔法,非常不错!

大家好&#xff0c;我是不才陈某~ 最近发现了一款很厉害的 Intellij IDEA 插件——Bito。 Bito 插件无需魔法&#xff0c;亲测有效&#xff0c;可以基于 GPT-4 来写代码同时还提供了一些有用的功能&#xff0c;如自动补全提交信息、快速查看历史记录等。 没使用魔法的情况下&am…

IDEA懒人必备插件:自动生成单元测试,太爽了!

程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 7 分钟。 来自&#xff1a;blog.csdn.net/sun5769675/article/details/111043213 今天来介绍一款工具Squaretest&#xff0c;它是一款自动生成单元测试的插件&#xff0c;会用到它也是因为最近公司上了代…

Mac Automator 图片自动压缩上传 COS

把个人博客放在了 netilfy 托管&#xff0c;它给了一个优化建议&#xff0c;可以压缩图片节省带宽。但是每次截图后都要再压缩下图片有点麻烦&#xff0c;于是想着应该可以偷偷懒。目标很明确&#xff0c;截图后图片传到我的 git 仓库 images 目录后&#xff0c;能给我自动压缩…

IDEA 28 个天花板技巧,YYDS!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

CSDN 去除图片水印

想要保存 CSDN 博客中的一张图片时&#xff0c;发现图片上有水印&#xff0c;想要删除&#xff0c;怎么办呢&#xff1f; 如下图 右击图片 --> [在新标签中打开图片] 把问号以及问号后面的内容全部删掉&#xff0c;再访问 呐&#xff0c;水印不见了。 PS&#xff1a;写博…

免费的图片去水印消除水印清除水印去水印方法去水印软件免费下载

是一款免费的图片去水印工具。适用于微博下载的&#xff08;偷的&#xff09;图&#xff0c;从别的地方下载的&#xff08;偷的&#xff09;图等。 ** 直接说下载链接&#xff1a;请点击链接里的普通下载&#xff0c;&#xff08;其他是别的下载器&#xff09; 当然&#xff…

批量图片去水印,操作简单,赶紧收藏!

图片怎么去水印?在平时的日常生活中&#xff0c;我们有时候需要用到一些图片或者视频&#xff0c;但是这些视频或者图片往往会有烦人的水印&#xff0c;我们需要去除水印后才能更好来使用~那么你都是怎么去除水印的呢?有什么比较简单轻松的批量图片去水印方法吗?小编这里有一…

2023新版 多功能去水印工具微信小程序源码_带流量主功能(已更新)

简介&#xff1a; 2023新版 多功能去水印工具微信小程序源码_带流量主功能 自带去水印接口的多功能小程序 支持各大平台短视频去水印 支持保存封面,图集,标题等等 支持本地图片去水印 支持图片拼接 支持九宫格切图 支持修改视频的MD5等等 另外当然也有流量主功能的 链…

去除CSDN博客图片水印

今天写论文时要用到之前写博客时的一张图片&#xff0c;但是直接复制过来有水印 &#xff0c;例如&#xff08;右下角&#xff09;&#xff1a; 后来找到了解决办法&#xff0c;故在这里分享一下&#xff1a; 1.右击博客中的图片&#xff0c;选择复制图片地址&#xff0c;如下&…

二十行代码去除图片水印(别再找工具修图啦)

别再找工具修图啦&#xff0c;用代码吧 图片上常常有多余信息&#xff0c;如水印等&#xff0c;常常困扰啦多少痴男怨女。 在简书上看到一段有意思的内容。于是将它搬啦过来。 原地址&#xff1a;https://www.meiwen.com.cn/subject/dofckqtx.html。 消除水印 原图和效果图…

怎么把照片里的水印去掉?这三个办法教给你

图片水印是指在图片上添加一些文字或图形&#xff0c;以标识该图片的来源或版权归属。它可以让人们更容易地辨认出图片的来源&#xff0c;从而增强品牌的辨识度。如果我们在网上看到很喜欢的照片&#xff0c;想要用来个人收藏或者当做背景图&#xff0c;而它的图片水印只是为了…

智能软件aaas系统的整体设计的内容构成和简单介绍---正文开篇 之 现实模型 -----计算机科学、认知科学及其他们的混血儿:计算机认知科学

在开始之前&#xff0c;首先需要说明一下&#xff1a;aaas的设计中大量借鉴了http://www.jfsowa.com/ 中的内容。只是为了软件智能的目的&#xff0c;整体结构、架构和工作机制不同。所借鉴的Jfsowa中的内容被拆散后分布于aaas系统的各个地方。这里一并说明&#xff0c;文档各处…

一、初识MVC的混血宠儿Struts2

Struts 2是一个MVC框架&#xff0c;吸收了Struts1和WebWork两者的精华&#xff0c;以WebWork设计思想为核心&#xff0c;吸收了Struts 1的部分优点&#xff0c;因此一举成为MVC框架领域的混血新宠儿。 一、这里提到了MVC&#xff0c;首先对MVC做一下介绍&#xff1a; 首先控制…