练手小项目(1)——智能聊天机器人

我一直坚信着,即使一个最简单的APP,也有他的难点,如果一个复杂的APP你无法做出来,那肯定是你基础不扎实,我身边的人总是问我,安卓为什么学了有忘记了,总是学不好,有些东西记不住,其实这不能怪你,如果别人开发了那么久的东西,你一下子就学会了,你让谷歌怎么活。


篇幅有限,如果读者看不懂的话,可以复习下基础,我尽量将代码简单化了。  先看效果图

如果你是初学安卓,这个APP你可能要半小时

如果你是有经验的开发者,OK,你可能看一遍就能将自己的开发类带入,10分钟不到就搞定。



开发步骤:

1. 先去图灵机器人注册KEY

http://www.tuling123.com/

2.准备好联网操作,将联网工具类放入

PS:这里是我自己的联网工具类,如果喜欢可以收藏

3.准备json解析

json解析并不复杂,所以只是用了自带json解析了

4.UI准备


5.业务逻辑准备




第一步 你先去 图灵机器人的官网申请key 这个不复杂,因为可以QQ登录 如果不想申请 那就用我的呗


key = 349baa5d2bd5d2d7612e4f2c1fcd973d   


第二步  联网获取json 


其实这个请求数据,没什么区别的,看看他的请求示例

private String url="http://www.tuling123.com/openapi/api?key=349baa5d2bd5d2d7612e4f2c1fcd973d&info=";

后面加入你的输入的信息 即可 

联网:1.Httpclient  2. Httpconnection 3.Xutils 4.各种工具类。


一个开发者,随着开发的东西越来越来多,积累的工具也越来越多,在这个小Demo 里 你可以使用自己的工具类 

我的联网工具类,是自己封装的  你可以在自带加入线程,用的是Httpconnection联网,然后根据IO操作 转成String  通过接口放回String类型。

package com.example.AiComputer;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteOrder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;/*** 封装的 网络 + 线程*/
public class HttpUtils {// 使用线程池来下载图片,同一时刻,最多有3个线程在运行private static ExecutorService execuotrs = Executors.newFixedThreadPool(3);interface OnBitmapNetWorkResponse {public void ok(Bitmap bitmap);public void error(String error);}public static void RequestBitmapNetWork(final String path,final OnBitmapNetWorkResponse response) {final Handler handler = new Handler();execuotrs.execute(new Runnable() {@Overridepublic void run() {boolean isNetWorkOK = false;try {URL url = new URL(path);HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();openConnection.setConnectTimeout(5000);openConnection.connect();if (openConnection.getResponseCode() == 200) {InputStream inputStream = openConnection.getInputStream();final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);handler.post(new Runnable() {@Overridepublic void run() {response.ok(bitmap);}});inputStream.close();isNetWorkOK = true;}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (!isNetWorkOK) {handler.post(new Runnable() {@Overridepublic void run() {response.error("服务器不在服务区内!");}});}}}});}public interface OnNetWorkResponse {public void ok(String response);public void error(String error);}public static void RequestNetWork(final String path,final OnNetWorkResponse response) {//实例化handler final Handler hanlder = new Handler();new Thread() {public void run() {//标志位boolean isWorkOK = false;InputStream inputStream = null;ByteArrayOutputStream outStream = null;try {URL url = new URL(path);System.out.println("=======path========="+path);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);connection.setDoInput(true);connection.connect();if (connection.getResponseCode() == 200) {inputStream = connection.getInputStream();outStream = new ByteArrayOutputStream();byte[] b = new byte[1024];int len = 0;while ((len = inputStream.read(b)) != -1) {outStream.write(b, 0, len);}outStream.flush();final String result = new String(outStream.toByteArray());hanlder.post(new Runnable() {@Overridepublic void run() {response.ok(result);}});isWorkOK = true;}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 网络操作出问题if (!isWorkOK) {response.error("服务器走神拉!");}if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (outStream != null) {try {outStream.close();} catch (IOException e) {e.printStackTrace();}}}};}.start();}}

 如果对于这一节,不懂的可以看下 我写的 网络编程系列

从java网络编程学起(2)     


第三步,就是json 解析 

我们在url后面加入 深圳的天气   返回的是

{"code":100000,"text":"今天多云 24~19°C明天阴 26~21°C后天阴 22~17°C"}

最外层是一个大括号,so 直接用JsonObject,解析即可 

JSONObject jb = new JSONObject(response);

4.UI准备 

其实对于ui  并不复杂,  最外层是一个 线性布局,里面是 两个线性布局,第一个装着listview ----->显示聊天信息  第二个 装着 一个button 发送消息 一个Edittext 输入信息

布局文件:activity_main.xml

<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:orientation="vertical" ><ListViewandroid:id="@+id/lv"android:layout_width="fill_parent"android:layout_height="0dp"android:layout_weight="1"android:divider="@null"android:listSelector="@android:color/transparent"android:transcriptMode="alwaysScroll" ></ListView><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><EditTextandroid:id="@+id/sendText"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" /><Button android:id="@+id/send_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发送"/></LinearLayout></LinearLayout>


既然说道了listview  就知道我们的聊天信息,要在上面显示,我们要在适配器中 判断是那个发送的消息,进行判断是哪个发送过来的 显示那部分布局 ,左边的是机器人的消息布局  右边是 我们发送消息的布局 

 也不复杂, 一个相对布局中有一个textview  显示发送时间,一个Imageview显示机器人的头像  一个textview 显示消息内容


机器人消息的布局 

<?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" ><TextViewandroid:id="@+id/time"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_horizontal" /><ImageViewandroid:id="@+id/iv"android:layout_width="70dp"android:layout_height="70dp"android:layout_below="@id/time"android:padding="10dp"android:src="@drawable/robot" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/time"android:layout_marginRight="50dp"android:layout_toRightOf="@id/iv"android:background="@drawable/aio_friend_bg_nor_11"android:gravity="center" /></RelativeLayout>

我们发送消息的内容 

<?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" ><TextViewandroid:id="@+id/time"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_horizontal" /><ImageViewandroid:id="@+id/iv"android:layout_width="70dp"android:layout_height="70dp"android:layout_alignParentRight="true"android:layout_below="@id/time"android:padding="10dp"android:src="@drawable/xiaoxin" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/time"android:layout_marginLeft="50dp"android:layout_toLeftOf="@id/iv"android:background="@drawable/aio_user_bg_nor_11"android:gravity="center" /></RelativeLayout>


不知不觉,就走到了最后一步,相信 你一定会觉得,好简单呀,是的很简单,因为最难的在后面

业务逻辑 :

1.Edittext 和listview 和button的实例化

2.button点击事件的处理 

获取 Edittext输入的内容,进行处理————>去掉空格和回车的信息,替代成空 。  然后将数据封装到实体类中去。 当大于30条的时候清空一次 然后刷新一下适配器

将处理好的信息 发送到服务器 获取 回复的信息 然后也封装进行实体类,刷新一下适配器


3. 设置欢迎语言,每一次进来,为了提高用户体验,我们进行欢迎语出现, 先建立一个数组  用来装 欢迎语


来到res/values/Strings 加入数组

   <string-array name="welcome_tips"><item>主人,奴婢在此等候多时了</item><item>主人,近来一切可好</item><item>亲爱的,我想死你了</item><item>欢迎归来,我亲爱的主人</item><item>我是小新机器人,很高兴为您服务</item></string-array>

然后再 java 代码中如一个方法

	private String getRandomWelcomeTips() {String welcome_tip = null;welcome_array = this.getResources().getStringArray(R.array.welcome_tips);int index = (int) (Math.random() * (welcome_array.length - 1));welcome_tip = welcome_array[index];return welcome_tip;}

应该不难看懂 通过随机 得到数组内容 

其中聊天嘛,应该把时间也加入

	private String getTime() {currentTime = System.currentTimeMillis();SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date curDate = new Date();String str = format.format(curDate);if (currentTime - oldTime >= 500) {oldTime = currentTime;return str;} else {return "";}}
也就是获取了下 系统时间,然后格式化了下   

Java代码 MainActivity

package com.example.AiComputer;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import org.json.JSONException;
import org.json.JSONObject;import com.example.AiComputer.HttpUtils.OnNetWorkResponse;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;public class MainActivity extends Activity implements OnClickListener{//输入框private EditText sendtext;private Button send_btn;private ListView listView;private String content_str;private String[] welcome_array;private String url="http://www.tuling123.com/openapi/api?key=349baa5d2bd5d2d7612e4f2c1fcd973d&info=";private double currentTime=0, oldTime = 0;private List<ListData> lists;private ListData listData;private MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {listView = (ListView) findViewById(R.id.lv);sendtext = (EditText) findViewById(R.id.sendText);send_btn = (Button) findViewById(R.id.send_btn);lists = new ArrayList<ListData>();//发送的点击事件send_btn.setOnClickListener(this);adapter = new MyAdapter(lists, this);listView.setAdapter(adapter);listData = new ListData(getRandomWelcomeTips(), ListData.RECEIVER,getTime());lists.add(listData);}private String getRandomWelcomeTips() {String welcome_tip = null;welcome_array = this.getResources().getStringArray(R.array.welcome_tips);int index = (int) (Math.random() * (welcome_array.length - 1));welcome_tip = welcome_array[index];return welcome_tip;}
/*1.获取 Edittext输入的内容,进行处理————>去掉空格和回车的信息,替代成空 。* 2.然后将数据封装到实体类中去。 当大于30条的时候清空一次 然后刷新一下适配器* */@Overridepublic void onClick(View v) {getTime();content_str = sendtext.getText().toString();sendtext.setText("");String dropk = content_str.replace(" ", "");String droph = dropk.replace("\n", "");listData = new ListData(content_str, ListData.SEND, getTime());lists.add(listData);if (lists.size() > 30) {for (int i = 0; i < lists.size(); i++) {lists.remove(i);}}adapter.notifyDataSetChanged();HttpUtils.RequestNetWork(url+droph, new OnNetWorkResponse() {@Overridepublic void ok(String response) {try {JSONObject jb = new JSONObject(response);// System.out.println(jb.getString("code"));// System.out.println(jb.getString("text"));ListData listData;listData = new ListData(jb.getString("text"), ListData.RECEIVER,getTime());lists.add(listData);adapter.notifyDataSetChanged();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void error(String error) {// TODO Auto-generated method stub}});}private String getTime() {currentTime = System.currentTimeMillis();SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date curDate = new Date();String str = format.format(curDate);if (currentTime - oldTime >= 500) {oldTime = currentTime;return str;} else {return "";}}
}
其实在没有点击的时候,欢迎语 已经通过适配器 显示到listview上面去了 所以我们可以放在adapter实例化下面  ,实体类,主要起的作用就是将 发送的时间和内容 封装好,在适配器中判断 进行展示

其实最重要的是 适配器的内容,应该怎么处理 发送过来的消息:

我们向适配器 传了两个值集合,装满了实体类数据的集合 一个上下文 

 我们先建立一个相对布局,用来填充条目的内容  我们要想一个list装着实体类,实体类,有很多数据 ,我们需要通过标识符来判断显示那部分内容。

package com.example.AiComputer;import java.util.List;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;public class MyAdapter extends BaseAdapter{private List<ListData> lists;private Context mContext;private RelativeLayout layout;public MyAdapter(List<ListData> lists,Context mContext) {this.lists = lists;this.mContext = mContext;}@Overridepublic int getCount() {return lists.size();}@Overridepublic Object getItem(int position) {return lists.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {LayoutInflater inflater = LayoutInflater.from(mContext);if(lists.get(position).getFlag() == ListData.RECEIVER){layout = (RelativeLayout) inflater.inflate(R.layout.leftitem, null);}if (lists.get(position).getFlag() == ListData.SEND) {layout = (RelativeLayout) inflater.inflate(R.layout.rightitem, null);}TextView tv = (TextView) layout.findViewById(R.id.tv);TextView time = (TextView) layout.findViewById(R.id.time);tv.setText(lists.get(position).getContent());time.setText(lists.get(position).getTime());return layout;}}




如有问题,可以在我博客上面留言


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

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

相关文章

python微信聊天机器人,再也不怕被夸情商高了

编写本聊天机器人纯属乐趣&#xff0c;它并不实用&#xff01;&#xff01;&#xff01; 文章有点长&#xff0c;代码分析只把完整代码拆分解释&#xff0c;没有新的东西&#xff0c;大佬可忽略 目录 实现思路完整代码代码分析导入要使用的模块获取窗口句柄获取窗口左上角和右…

一个基于智能问答的聊天机器人实现

智能问答应当是未来智能化发展中人机交互的主要方式&#xff0c;目前无论是在开源社区或者企业应用中&#xff0c;都有广泛的应用。 项目名称是Iveely.Brain&#xff0c;本次源码可以在Github的这里下载&#xff0c;,是主要用于聊天服务的一个项目&#xff0c;本次开源版本的示…

【开源】一个基于智能问答的聊天机器人实现

智能问答应当是未来智能化发展中人机交互的主要方式&#xff0c;目前无论是在开源社区或者企业应用中&#xff0c;都有广泛的应用。 项目名称是Iveely.Brain&#xff0c;本次源码可以在Github的这里下载&#xff0c;,是主要用于聊天服务的一个项目&#xff0c;本次开源版本的示…

【NLP-ChatBot】能干活的聊天机器人-对话系统概述

我们之前介绍过&#xff0c;按照应用场景的不同&#xff0c;聊天机器人可以分为问答系统&#xff0c;对话系统以及闲聊机器人三类。今天我们就来详细讲一讲其中的对话系统。 作者&编辑 | 小Dream哥 1 什么是对话系统 通常来讲&#xff0c;对话系统会面向某一个任务&#xf…

【NLP】自己搭一个多轮对话聊天机器人(附实现源码)

【NLP】自己搭一个多轮对话聊天机器人&#xff08;附实现源码&#xff09; 01 项目框架02 模型2.1 粗排2.1.1BM252.1.1 Bool检索 2.2 精排意图识别 03 API交互04 微信前端 本文的内容如下 本篇介绍一个检索类型的 多轮问答系统/聊天机器人&#xff0c;通过API异步通信&#xf…

手把手教你写一个中文聊天机器人

本文来自作者 赵英俊&#xff08;Enjoy&#xff09; 在 GitChat 上分享 「手把手教你写一个中文聊天机器人」&#xff0c;「阅读原文」查看交流实录。 「文末高能」 编辑 | 哈比 一、前言 发布这篇 Chat 的初衷是想和各位一起分享一下动手来做聊天机器人的乐趣&#xff0c;因此…

NLP聊天机器人的搭建(chatbot)(一)

最近在学习研发QA系统&#xff0c;本人单纯想记录一下。项目源码和思路主要参考知乎专栏&#xff1a; PyTorch搭建聊天机器人&#xff08;一&#xff09;词表与数据加载器 - 知乎 PyTorch搭建聊天机器人&#xff08;二&#xff09;定义seq2seq网络前向逻辑 - 知乎 PyTorch搭…

全国大学生英语竞赛培训:听力、词汇语法、完形填空、阅读理解、翻译、改错、IQ题、大小作文、语法等部分快速得分、备战策略和获奖技巧讲解!

目 录 大学生英语竞赛培训——介绍、学习网址 PPT课件、视频——下载 【2020-04-05】P1 如何准备大学生英语竞赛才能拿奖&#xff1f;2:27:54【竞赛简介vs赛前准备】 【2020-04-11】P2 如何快速搞定大英赛大小作文&#xff1f;2:06:18【大小作文&#xff0c;快速表达~】 …

【情态动词练习题】 May 与 might

1. May 1.Sarah may be ill 2.We may not go out. 3.It may not rain. 4.We may buy a car. 5.Joe may not be at home 6.Anna may need help. 注&#xff1a;情态动词一定要加上动词原型 7.The baby may be hungry. 8.I may not change my job. 9.She may be married. 10.He…

初中七年级上计算机试题答案,人教版初中英语七年级英语上册期中模拟试题检测(含答案)...

原标题&#xff1a;人教版初中英语七年级英语上册期中模拟试题检测(含答案) 七年级英语期中测试题 1、 单项选择(10分) ( ) 1. 下列单词中含有相同元音因素的是_____. A that; these B thank; that C this; those ( ) 2. --________, Gina! --Good morning, Bob! A Good aftern…

初中七年级下英语期中备考单选题(外教出题并附助教经典解析)

1. My sister bought a present _______ her best friends birthday. A. for B. of C. about D. to 选出正确的介词&#xff0c;完成句子。问题&#xff1a; 我妹妹买了一份礼物给她最好的朋友庆祝生日。 答案&#xff1a;A 解析&#xff1a;在这个句子中&#xff0c;“fo…

ChatGPT 爆火 小扎、马斯克纷纷迎战ChatGPT

ChatGPT爆火&#xff0c;直接改变了整个硅谷大厂的格局。近日&#xff0c;马斯克、小扎也纷纷下场&#xff0c;正式对ChatGPT宣战&#xff01;据The Information报道&#xff0c;马斯克最近几周与一直在于AI研究人员接洽&#xff0c;希望组建一个新的研究实验室&#xff0c;以开…

百度「文心一言」阿里「通义千问」腾讯的AI将会叫什么呢

阿里于昨天2023.4.7下午上线通义千问&#xff0c;与ChatGPT类似&#xff0c;同样是基于语言模型训练的人工智能聊天平台。通义千问的核心功能分为四个大类&#xff1a;撰写短文、职场助理、电影脚本和写封邮件。 通义千问通义千问https://tongyi.aliyun.com/ 首页如下&#xf…

ChatGPT Chat Assist: 职场智能利器,提升工作效率

在当今快节奏的职场生活中&#xff0c;高效率是每位职场人士追求的目标。而现代科技的进步&#xff0c;尤其是人工智能的快速发展&#xff0c;为我们带来了前所未有的便利。ChatGPT作为一款智能核心&#xff0c;推出了Chat Assist插件&#xff0c;成为职场中的得力助手&#xf…

ChatGPT通过图灵测试,图灵测试要重写

近日《Nature》在一篇文章中称&#xff0c;ChatGPT 已经攻破了图灵测试&#xff0c;是时候要启用其他新的方法来评估人工智能技术了。 图灵测试(Turing Test)是著名计算机科学家阿兰图灵在1950年提出的一个测试,用于判断机器是否能展现出与人类智能相当的能力。其测试方法是: 让…

亚马逊云科技X创业邦:专访图灵量子创始人金贤敏

假设你现在正准备去相亲,走进了一家坐满人的咖啡厅。你拿着Ta的照片,一个个地审视着每一个人,看谁对得上号,结果找了半个小时也没找到和照片相似的那个人。这时候,相亲对象给你打来了电话,告诉你Ta正坐在靠窗的角落里,你的目光顺着ta的指引,一下子就找到了Ta。 验证一个问题的答…

马斯克与马云对谈:一场科技乐观主义者的尬聊

硅谷Live / 实地探访 / 热点探秘 / 深度探讨 即使同为技术信徒&#xff0c;话不投机也在所难免。 本文由极客公园原创&#xff0c;阅读更多内容请关注极客公园微信公众号&#xff08;ID&#xff1a;GeekPark&#xff09; 在昨天开幕的 2019 世界人工智能大会上&#xff0c;阿里…

马斯克:我抽大麻、藐视SEC,但我是个好CEO

原文&#xff1a;CBS《60分钟》编译&#xff1a;新浪科技 樵夫 导语&#xff1a;特斯拉CEO马斯克&#xff08;Elon Musk&#xff09;被人称为天才&#xff0c;人们都认为他非常具有远见卓识。 但是今年&#xff0c;相比于他的卓越才华&#xff0c;人们似乎更加关注他的行为&…

马云对话马斯克:福报变成了一周工作12小时?

燃财经&#xff08;ID:rancaijing&#xff09;整理 作者 | 刘景丰 编辑 | 魏佳 8月29日&#xff0c;2019世界人工智能大会&#xff08;WAIC&#xff09;在上海举行。开幕式后&#xff0c;美国卡内基梅隆大学计算机学院院长汤姆米切尔&#xff08;Tom Mitchell&#xff09;、腾讯…

Vicuna:斯坦福开源一个性能相当于90%ChatGPT的聊天机器人

自从Meta公司发布LLaMA以来&#xff0c;围绕它微调和开发的模型越来越多&#xff0c;这得益于它的性能和效果&#xff0c;2023年3月份发布的草泥马&#xff08;Alpaca&#xff09;是由Meta的LLaMA 7B微调而来的全新模型&#xff0c;仅用了52k数据&#xff0c;性能约等于GPT-3.5…