前言

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

百度有小度,小米有小爱,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

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

  1. 基于android studio开发多人电话语音视频会议入门实例demo含app下载链接

    目录 说明 视频演示 图文演示 android版本支持 相关下载 说明 这是一个相对完整的客户端+服务器端的项目,适合入门学习研究.包含android摄像头.麦克风使用权限的动态申请,控件的事件绑定, ...

  2. (超多图)基于Android studio开发的一个简单入门小应用(超级详细!!)(建议收藏)

    基于Android studio开发的一个简单入门小应用 一.前言 二.前期准备 三.开发一个小应用 五.运行应用 一.前言 在暑假期间,我学习JAVA基础,为了能早日实现自己用代码写出一个app的& ...

  3. 基于Android Studio开发的旅游记录与分享APP源码,Android旅游路线记录与分享APP源码

    GoTravelling 旅游路线记录与分享Android App--同享旅行 下载地址:基于Android Studio开发的旅游记录与分享APP源码 App介绍 目标用户 在寒暑假内希望结伴同游的 ...

  4. 基于 Android studio 开发的一个记账本

    目录 1. 项目简介 1.1项目设计目标 1.2项目功能分析 2. 需求分析 2.1特性需求分析 2.2功能需求分析 3. 项目设计 3.1总体设计 3.2数据库ER图 3.3功能模块设计 4. 项目 ...

  5. 基于Android studio开发高德地图之连续定位、标点、画线

    目录 获取key值 创建地图 layout文件 Activity 源码:https://github.com/zzjdreams/gaode_map_track 截图:(这个是我叫我弟截图的,所以不是 ...

  6. java基于安卓的人脸识别_基于android studio开发的 opencv关于android人脸识别的DEMO

    (2018年11月23日 在 链接 补充了一个新的BUG) 一个新项目的导入 可能会遇到多个问题,就这些问题 做个 解决集合,以便日后回顾, 版本 : android studio3.1.4 ,ope ...

  7. Android移动应用设计与开发(第2版)——基于Android Studio开发环境 胡敏 黄宏程 李冲编著

    Android移动应用设计与开发_基于Android_Studio开发环境_第2版 电子资源不可上传,需要加q+1074476581 麻烦备注好书名哦

  8. 基于Android Studio开发的笔记APP

    1 程序的运行环境.安装步骤 运行环境 JDK 1.8 compileSdkVersion 27 程序的组成部份 Xml布局文件 Java程序文件 点击此处下载文档和源码

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)...

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  10. SuperMap iMobile+Android studio开发入门(二)——超图示例代码运行

    背景:这里运行的是"产品入门"的"基于Android studio开发移动GIS程序"的"开发三维移动GIS程序",本篇对超图帮助文档进行了 ...

最新文章

  1. DHCP在企业网中的应用
  2. 基于哈希的图像检索 HABIR(HASHING BASELINE FOR IMAGE RETRIEVAL)
  3. php 浏览器 兼容,兼容ie6浏览器的php下载文件代码分享
  4. Cloud for Customer custom BO创建时间随着行项目数量增加而增加的关系
  5. 水库调度matlab,基于MATLAB模糊系统在水库调度中的应用初探_廖明潮
  6. 关于C#打包部署文件夹问题
  7. 为什么越来越多的人喜欢自驾游?
  8. 在React中测试和调试
  9. python字符串format和center居中应用(三分钟读懂)
  10. pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南
  11. xlua的hotfixManager
  12. ipv6看电视的链接
  13. php中file_get_contents与curl性能比较分析
  14. 16秋南开计算机应用答案,南开16秋学期《计算机应用基础》在线作业.doc
  15. python中复数表达形式_在Python中实现复数比较?
  16. 中国人工智能学会通讯——AI Platform for Business: Research Roadmap
  17. 旅行青蛙(旅かえる)逆向笔记
  18. 2022国赛D题气象报文信息卫星通信传输参考代码及思路
  19. 【视频学习】大神教你玩转Excel,收获高效人生
  20. 全国计算机技术与软件专业技术资格(水平)考试 网络工程师,网络工程师2013至2018年试题分析与解答(全国计算机技术与软件专业技术资格(水平)考试指定用书)...

热门文章

  1. 搭建MQTT服务器实现Android客户端与ESP8266之间即时通信
  2. 状态压缩dp学习小记part1
  3. kodi文件管理smb服务器,KODI win10,kodi不能发现smb共享
  4. 机器狗病毒(又称下载者木马病毒)的手工毒杀
  5. cell flash cache 的使用
  6. deepin/ubuntu 惠普星14 锐龙版本 安装RTL8821CE 无线网卡驱动
  7. 城市空气质量监测系统解决方案
  8. 手持式矢量网络分析仪
  9. 完美世界hr给大家的简历修改和面试的建议
  10. 微信PC版通信协议研究