智能聊天机器人-图灵机器人项目说明

文章目录

  • 智能聊天机器人-图灵机器人项目说明
    • 1.项目介绍
    • 2.项目用到的技术
    • 3.项目的开发环境
    • 4.开发步骤
      • 1.首先编写主界面(activity_main.xml文件),这个界面主要是一些简单的基础控件,与一个ListView
      • 2.访问http://www.turingapi.com/ 申请注册图灵机器人(免费版)
      • 3.导入主界面需要的图片(drawable文件内)以及需要的xml定义的样式资源
      • 2.搭建聊天的条目布局
      • 3.创建一个ChatBean类来存放消息信息这些属性
      • 4.创建一个ChatAdapter数据适配器来对ListView进行数据适配
      • 5.添加其他操作(1.在清单文件添加网络权限 2.添加okhttp库)
      • 6.主程序MainActivity文件

1.项目介绍

Github项目地址:https://github.com/Churchillhua-wangfei/WF_Violet_RobotProject

基于这钉钉时代(疫情阶段),在家闷得慌,以一个初学者的身份制作一个Android图灵机器人聊天项目。
效果图:

2.项目用到的技术

简单的XML基础 + ListView控件 + 数据器适配 + Postman请求调用API

3.项目的开发环境

操作系统:windows10 1909
开发工具: JDK8 + Android studio 3.5.2 + 模拟器(Android8.0)
Android版本: Android API29
第三方API网址:http://www.turingapi.com/

4.开发步骤

1.首先编写主界面(activity_main.xml文件),这个界面主要是一些简单的基础控件,与一个ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#E7E7E7"android:orientation="vertical"tools:context=".MainActivity"><RelativeLayoutandroid:id="@+id/head"android:layout_width="match_parent"android:layout_height="42dp"android:background="#fff"><ImageViewandroid:id="@+id/re"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:layout_marginTop="7dp"android:src="@drawable/re" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_marginLeft="5dp"android:layout_toRightOf="@+id/re"android:text="王飞的Robot-薇尔莉特"android:textColor="#000000"android:textSize="16dp" /><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginTop="4dp"android:layout_marginRight="10dp"android:src="@drawable/config" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/list"android:layout_width="match_parent"android:layout_height="match_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="match_parent"android:layout_height="55dp"android:layout_alignParentBottom="true"android:background="@drawable/bottom_bg"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_marginLeft="3dp"android:layout_marginTop="10dp"android:src="@drawable/voice"/><Buttonandroid:id="@+id/btn_send"android:layout_width="75dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="10dp"android:background="@drawable/button_circle_shape"android:fontFamily="sans-serif-black"android:text="发 送"android:textColor="#FCFCFC"android:textSize="14sp" /><EditTextandroid:id="@+id/et_send_msg"android:layout_width="match_parent"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_marginLeft="45dp"android:layout_marginRight="10dp"android:layout_toLeftOf="@id/btn_send"android:background="@drawable/textview_circle_item"android:singleLine="true"android:textColor="@android:color/black"android:textSize="18sp" /></RelativeLayout></RelativeLayout>
</LinearLayout>
2.访问http://www.turingapi.com/ 申请注册图灵机器人(免费版)
3.导入主界面需要的图片(drawable文件内)以及需要的xml定义的样式资源

详细可以参考Github:https://github.com/Churchillhua-wangfei/WF_Violet_RobotProject

1.btn_send_selector.xm

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按钮按下的颜色  -->
<item android:drawable="@android:color/darker_gray"android:state_pressed="true" />
<item android:drawable="@color/btn_send_bg_normal" /></selector>

2.button_circle_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--设置填充的颜色--><solid android:color="#6EA74F" />
<!--设置按钮的四个角为弧形  --><corners android:radius="25dp" />
<!--设置Button里面的文字与边界的间隔  --><paddingandroid:bottom="2dp"android:left="2dp"android:right="2dp"android:top="2dp"/></shape>

3.chat_left_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/chat_left_bg_pressed"android:state_pressed="true" /><item android:drawable="@drawable/chat_left_bg_normal" />
</selector>

4.chat_right_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/chat_right_bg_pressed"android:state_pressed="true" /><item android:drawable="@drawable/chat_right_bg_normal" />
</selector>

5.textview_circle_item.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><!--设置填充的颜色--><solid android:color="#FFFFFF" /><!--设置按钮的四个角为弧形    --><corners android:radius="25dp" /><!--设置Button里面的文字与边界的间隔    --><paddingandroid:bottom="10dp"android:left="10dp"android:right="10dp"android:top="10dp"/>
</shape>

6.values(clolors.xml)

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#F57C00</color><color name="colorPrimaryDark">#F57C00</color><color name="colorAccent">#D81B60</color><color name="btn_send_bg_normal">#95EC69</color>
</resources>

7.values(strings.xml)

<resources><string name="app_name">图灵机器人</string><string-array name="welcome"><item>遇见你,真美好</item><item>客人,听好了。我的名字是薇尔莉特</item><item>这位客人,我的名字是薇尔莉特</item><item>请问客人你有什么需要?</item></string-array>
</resources>

8.values(styles.xml)

<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. --><item name="colorPrimary">#0288D1</item><item name="colorPrimaryDark">#0288D1</item><item name="colorAccent">@color/colorAccent</item></style><style name="chat_content_style"><item name="android:minHeight">50dp</item><item name="android:gravity">center_vertical</item><item name="android:layout_marginTop">12dp</item><item name="android:textColor">#000000</item><item name="android:textStyle">bold</item><item name="android:textSize">15sp</item><item name="android:lineSpacingExtra">2dp</item><item name="android:clickable">true</item><item name="android:focusable">true</item><item name="android:background">#bfbfbf</item></style></resources>
2.搭建聊天的条目布局

1.chatting_robot_item.xml

``

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="6dp"><TextViewandroid:id="@+id/tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="2020年4月29日上午10点"android:layout_centerHorizontal="true"android:textColor="#000000"android:textSize="18sp"/><ImageViewandroid:id="@+id/iv_head"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:layout_marginTop="15dp"android:layout_marginLeft="2dp"android:background="@drawable/violet"android:focusable="false"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="薇尔莉特"android:layout_below="@+id/iv_head"android:textColor="#7B1FA2"android:textSize="16dp"android:layout_marginTop="5dp"android:layout_marginLeft="5dp"android:textStyle="bold"/><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_marginTop="30dp"android:layout_toEndOf="@id/iv_head"android:background="@drawable/chat_left_selector" /></RelativeLayout>

2.chatting_user_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="6dp"><TextViewandroid:id="@+id/tv_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="2020年4月29日上午10点"android:layout_centerHorizontal="true"android:textColor="#000000"android:textSize="18sp"/><ImageViewandroid:id="@+id/iv_head"android:layout_width="55dp"android:layout_height="55dp"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:layout_marginTop="15dp"android:layout_marginRight="2dp"android:background="@drawable/wangfei"android:focusable="false"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/iv_head"android:layout_alignParentRight="true"android:text="王飞"android:textSize="20dp"android:textStyle="bold"android:layout_marginTop="8dp"android:layout_marginRight="8dp"android:textColor="#090909"/><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_marginTop="30dp"android:layout_toLeftOf="@id/iv_head"android:background="@drawable/chat_right_selector" /></RelativeLayout>
3.创建一个ChatBean类来存放消息信息这些属性
package com.mzxy.wangfei_robot_chattingproject;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;}
}
4.创建一个ChatAdapter数据适配器来对ListView进行数据适配
package com.mzxy.wangfei_robot_chattingproject;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;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 contentView, ViewGroup viewGroup) {Holder holder = new Holder();//判断当前的信息是发送的信息还是接收到的信息,不同信息加载不同的viewif (chatBeanList.get(position).getState() == ChatBean.RECEIVE) {//加载左边布局,也就是机器人对应的布局信息contentView = layoutInflater.inflate(R.layout.chatting_robot_item,null);} else {//加载右边布局,也就是用户对应的布局信息contentView = layoutInflater.inflate(R.layout.chatting_user_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;}class Holder {public TextView tv_chat_content; // 聊天内容}
}
5.添加其他操作(1.在清单文件添加网络权限 2.添加okhttp库)

1.在清单文件添加网络权限

<!--添加网络权限  -->
<uses-permission android:name="android.permission.INTERNET" />

2.添加okhttp库(在build.gradle文件中添加)–在dependencies

dependencies{
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}
6.主程序MainActivity文件
package com.mzxy.wangfei_robot_chattingproject;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
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;public class MainActivity extends AppCompatActivity {/**** @author:王飞* @My_GitHub:https://github.com/Churchillhua-wangfei* @Project_FinishTime:2020年4月29日——09点09分*/private ListView listView;private ChatAdapter adpter;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 = "40abb943778c472ea40e9c31e1a3c339";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 = findViewById(R.id.list);et_send_msg =  findViewById(R.id.et_send_msg);btn_send =  findViewById(R.id.btn_send);adpter = new ChatAdapter(chatBeanList, this);listView.setAdapter(adpter);btn_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {sendData(); // 点击发送按钮,发送信息}});et_send_msg.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View view, 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_SHORT).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集合中adpter.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 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);}@Overridepublic void onFailure(Call call, IOException e) {}});}/** 事件捕获 */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); // RECEIVE表示接收到机器人发送的信息chatBeanList.add(chatBean); // 将机器人发送的信息添加到chatBeanList集合中adpter.notifyDataSetChanged();}private void updateView(int code, String content) {// code有很多种状,先弄几组测试数据switch (code) {case 4004:showData("测试数据01");break;case 40005:showData("测试数据02");break;case 40006:showData("测试数据03");break;case 40007:showData("测试数据04");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);}
}

试数据04");
break;
default:
showData(content);
break;
}
}

protected long exitTime; // 记录第一次点击时的时间

@Override
public 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);
}
}

##### 7.最后清理不必要的文件,Build APK文件

Android图灵聊天机器人-薇尔莉特相关推荐

  1. Stable Diffusion:使用Lora用二十张图片训了一个简易版薇尔莉特头像生成器(不作商用,纯纯个人兴趣,狗头保命)

    目录 一.系统环境 二.数据准备及预处理 三.使用Stable Diffusion获取图像信息 四.安装训练图形化界面 五.参数设置及训练过程 六. 效果测试 七.常见报错处理 一.系统环境 同上一篇 ...

  2. CSS和HTML做的二次元薇尔莉特(伪),新手上路,请多关照!!!!

    想来想去还是在CSDN上写了第一个博客!!! 请指教!!!! 这是在我做好的效果: 在CSBN用不来上传视频的我 由于我喜欢薇尔莉特,再加上血了css和html,于是做了个这玩意!! 新手上路,请多关 ...

  3. P4965 薇尔莉特的打字机

    题目背景 只要客人有意向,不论身在何处,都能上门服务.我是自动手记人偶服务--薇尔莉特·伊芙加登. 题目描述 薇尔莉特的打字机用了太久,按键已经开始老化了,因此有时候按键会没有反应.而薇尔莉特总是盲打 ...

  4. Unity 图灵Turning 之 在Unity中实现图灵 聊天机器人 简单聊天的功能

    Unity 图灵 之 在Unity中实现图灵 聊天机器人 简单聊天的功能 目录 Unity 图灵 之 在Unity中实现图灵聊天机器人简单聊天的功能 一.简单介绍 二.图灵官网关于在线聊天机器人的接入 ...

  5. Android智能聊天机器人的实现

    一 .概述 本博客主要介绍了使用android studio接入图灵机器人,实现智能聊天机器人的功能. 二.注册图灵机器人 进入图灵机器人官网,创建自己的图灵机器人 图灵机器人官网 点击机器人,进入机 ...

  6. JAVA课程设计--图灵聊天机器人

    关于环境 JDK安装 Java JDK安装与配置 Maven安装与配置 Maven的安装与配置 IDEA安装 IDEA历史版本寻找 IDEA2021.2.1 一个破解教程 关于开发 软件 IDEA20 ...

  7. 洛谷4965 薇尔莉特的打字机(Trie,DP)

    神仙题. 考虑在一棵 Trie 上进行染色,将可能出现的串的末尾染成黑色.答案就是黑点的个数.一开始只有 \(A\) 的末尾点是黑色. 当出现一个字符(不是退格)\(c\) 时,就要将每个黑点的 \( ...

  8. luogu[U103720]薇尔莉特 题解

    题面点这里 概括一下题目,就是维护矩阵or,要求最后整个矩阵的和,异或和 考虑对需要操作的值valvalval进行二进制拆分,由于or对于一个二进制位上的操作是永久性的,那我们对每一位进行二维差分,最 ...

  9. 周赛-薇尔莉特的委托-并查集应用

    题目链接 思路: 分别对所有路建立前缀并查集和后缀并查集,破坏L到R的路时,只需合并L-1,和R+1的集合. Code: #include <bits/stdc++.h> #define ...

最新文章

  1. Python的包管理工具Pip
  2. Java高并发编程(六):重入锁
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配标志
  4. MyBatis常用配置解析-Properties标签
  5. WinRT开发语言的功能和效率
  6. 全国首个人工智能专业,怎么学?
  7. 如何安装mysql 5.6_如何安装MySQL 5.6?
  8. ORACLE中CONSTRAINT的四对属性
  9. 决策树分箱-特征工程之数据离散化处理-基于python实现
  10. office visio 2007 画流程图
  11. Android Download 下载功能深入研究(二) : 速度提升之探索
  12. python装饰器讲解_Python装饰器讲解的不能再通俗易懂了(建议收藏)
  13. python 谷歌翻译接口_使用python调用谷歌翻译接口实现英文到中文的翻译
  14. php redis超卖,PHP用redis解决超卖的问题
  15. 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
  16. [PMZL]第1卷-误入天庭-01
  17. 专注低功耗蓝牙 创新微MinewSemi致力“将世界带入物联网时代”
  18. Kubernetes集群中Pod间文件拷贝
  19. 抽象类可以只实现接口的一部分方法
  20. js-isNaN | Number.isNaN

热门文章

  1. 计算机视觉热点探讨:MLP,RepMLP,全连接与“内卷”
  2. 【Windows编程】Dll的注入与调用
  3. 独立产品灵感周刊 DecoHack #041 - 那些独立开发者是怎么养活自己的
  4. php OpenSSL工具命令导出.cer证书密钥
  5. Word设置从当前页面设置页码
  6. 临沂市职业经理人协会举办第五届企业发展论坛
  7. java所有状态码(400/500)
  8. 整体大于部分_软装 | 整体大于部分之和的生活哲学
  9. 个头小力量大:微型无人机操控比自身重40倍的物体
  10. 常用排序算法总结(C语言版)