Android开发之智能聊天机器人_移动应用开发智能聊天机器人-程序员宅基地

技术标签: java  android  前端  


Android实现智能聊天机器人
最近在做项目中,突然来了灵感,要做一个聊天机器人.聊天机器人在很多大型App上都有使用,比如QQ群里的QQ小冰,淘宝京东等App上在没有人工客服之前会有机器人跟你聊天,根据你发的问题关键词,向你推荐一些答案,可以省下很多人工的时间以及减小服务器的压力。

此功能主要原理:
1.接入图灵机器人api,拼接上你输入框的消息;

2.根据api完成网络请求消息的接收与发送

3.完成布局页面

4.实现你和小洛的对话
废话不多说,直接上图和代码

一:效果图

在这里插入图片描述

二:注册图灵机器人,获取api

1.进入图灵机器人官网注册,已有账号的可直接登录

在这里插入图片描述

2.点击创建机器人

在这里插入图片描述

3.创建好机器人之后会得到一个ApiKey(如图所示)

在这里插入图片描述

4.下面就要拼接Api地址了(拼接方法如图所示)

拼接方法:http://www.tuling123.com/openapi/api?key=你自己的apikey&info=你要发送的话&userid=你自己的唯一标示(在代码中会指出)
在这里插入图片描述

三.下面就是具体实现的代码了

1.首先是布局文件(activity_main)

在这里插入图片描述

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- transcriptMode 自动向下滚动    alwaysScroll一直向下滚动状态;   divider设置间隔线效果 ;   listSelector设置没有滑动效果 -->

    <ListView
        android: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>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#229dec"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/et_sendText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="7dp"
            android:layout_weight="1"
            android:background="@drawable/bg_edittext_selector"
            android:paddingBottom="7dp"
            android:paddingTop="7dp" />

        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="7dp"
            android:background="@drawable/bg_button"
            android:text="发送" />
    </LinearLayout>

</LinearLayout>

2.左布局文件(leftitem)

在这里插入图片描述

<?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">

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/tv_time"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:src="@drawable/by2" />

    <TextView
        android:layout_below="@id/tv_time"
        android:layout_marginTop="10dp"
        android:layout_marginRight="10dp"
        android:layout_toRightOf="@id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:id="@+id/tv"
        android:gravity="center"
        android:background="@drawable/left"/>


</RelativeLayout>

3.右布局文件(rightitem)

在这里插入图片描述

<?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">

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="fill_parent"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentRight="true"
        android:layout_below="@id/tv_time"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:src="@drawable/by5" />
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_time"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="14dp"

        android:layout_toLeftOf="@id/iv"
        android:background="@drawable/right"
        android:gravity="center"
        android:padding="12dp" />
</RelativeLayout>

4.bg_edittext_selector.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="5dip" />

    <stroke
        android:width="1dip"
        android:color="#BDC7D8" />

</shape>

5.bg_button.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <solid android:color="#80cccf" /> <!-- 背景色 -->

    <stroke
        android:width="0.01dp"
        android:color="#80cccf" />  <!-- 邊框的顏色 -->

    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

6.HttpData

package robot.com.myapplication;
import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 *
 */
public class HttpData extends AsyncTask<String, Void, String> {
    

	private HttpClient httpClient;
	private HttpGet httpGet;
	private HttpResponse httpResponse; //��ȡ���ص�����
	private HttpEntity httpEntity;//����httpʵ��
	private InputStream in; //����ȡ��������ת��Ϊ���ļ�
	
	private HttpGetDataListener listener;//ʵ���Զ����HttpGetDataListener�ӿ�,���ҹ��컯���ݲ���
	
	private String url;
	public HttpData(String url ,HttpGetDataListener listener) {
    
		this.url = url;
		this.listener = listener;
	}
	
	@Override
	protected String doInBackground(String... params) {
    //ʵ�ֽӿں���д�˷���,�˷����������ǣ�����get�����ȡ����
		try {
    
			httpClient = new DefaultHttpClient();//ʵ�����ͻ���
			httpGet =  new HttpGet(url);//ʹ��get��ʽ��ͨ������URL������
			httpResponse = httpClient.execute(httpGet); //ͨ���ͻ��˷�������
			httpEntity = httpResponse.getEntity();//ͨ��httpResponse�����ȡ����
			
			Log.i("haha1", "----------"+httpEntity.toString());
			
			in = httpEntity.getContent();//��ȡʵ��ľ�������
			BufferedReader br = new BufferedReader(new InputStreamReader(in));//��ȡ���������ݺ�ͨ�����������ж�ȡ
			
			Log.i("haha2", "----------"+br.toString());
			
			String line = null; //��ȡ����
			StringBuffer sb = new StringBuffer();//������������
			while((line  = br.readLine()) != null){
     //��ȡ������������
				sb.append(line); //�洢���ݵ�StringBuffer��
			}
			
			Log.i("haha3", "----------"+sb.toString());
			
			return sb.toString();//ת��ΪString����
			
		} catch (Exception e) {
    
			// TODO: handle exception
		}
		return null;
	}
	/**����
	 * ��д�˷�����ͨ���ⷽ����ȡ����
	 */
	@Override
	protected void onPostExecute(String result) {
    
		listener.getDataUrl(result);//��������
		
		Log.i("haha4", "----------"+result);
		
		super.onPostExecute(result);
	}
}

7.HttpGetDataListener

package robot.com.myapplication;

public interface HttpGetDataListener {
    
	void getDataUrl(String data);
}

8.ListData

package robot.com.myapplication;
/**
 *
 */
public class ListData {
    
	public static final int  SEND = 1;
	public static final int  RECEIVE = 2;
	private String content;
	private int flag;//��ʶ
	private String time;
	
	public ListData(String content, int flag, String time) {
    
		setContent(content);
		setFlag(flag);
		setTime(time);
	}

	public String getContent() {
    
		return content;
	}

	public void setContent(String content) {
    
		this.content = content;
	}

	public int getFlag() {
    
		return flag;
	}

	public void setFlag(int flag) {
    
		this.flag = flag;
	}

	public String getTime() {
    
		return time;
	}

	public void setTime(String time) {
    
		this.time = time;
	}
	

}

9.TextAdapter

package robot.com.myapplication;

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;

import java.util.List;

/**
 *
 */
public class TextAdapter extends BaseAdapter{
    
	
	private List<ListData> lists;//���ϵ���������
	private Context mContext;//�н������ĵ�Context
	
	private RelativeLayout layout;
	
	public TextAdapter(List<ListData> lists, Context mContext) {
    
		this.lists = lists;
		this.mContext = mContext;
	}

	@Override
	public int getCount() {
    //����lists�����ص�����
		return lists.size();
	}

	@Override
	public Object getItem(int position) {
    
		return lists.get(position);
	}

	@Override
	public long getItemId(int position) {
    
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
    
		LayoutInflater inflater = LayoutInflater.from(mContext);
		if(lists.get(position).getFlag() == ListData.RECEIVE){
    
			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
		TextView tv_time = (TextView) layout.findViewById(R.id.tv_time);//ʱ��textView
		tv.setText(lists.get(position).getContent());  //���������ݷ��MTextView��
		tv_time.setText(lists.get(position).getTime());//���¼�д��TextView
		return layout;
	}

}

10.主java文件(MainActivity)

package robot.com.myapplication;

import android.view.View;

import java.text.SimpleDateFormat;
import java.util.Date;

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 android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
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 AppCompatActivity implements
        HttpGetDataListener,View.OnClickListener {
    

    private HttpData httpData;// �첽�������
    private List<ListData> lists;
    private ListView lv;
    private EditText et_sendText;
    private Button btn_send;
    private String content_str; // �惦��EditText�@ȡ���Ĕ���
    private TextAdapter adapter;
    private String[] welcome_arry;//��ӭ��
    private double currentTime,oldTime = 0;//�Ի�ʱ��

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("haha7", "----------7");
        initView();
        Log.i("haha8", "----------8");
    }

    /**
     * ʵ��������
     */
    private void initView(){
    
        lists = new ArrayList<ListData>();
        lv = (ListView) findViewById(R.id.lv);
        et_sendText = (EditText) findViewById(R.id.et_sendText);
        btn_send = (Button) findViewById(R.id.btn_send);
        btn_send.setOnClickListener(this);
        adapter = new TextAdapter(lists, this);
        lv.setAdapter(adapter);//��adapter
        ListData listData;
        listData = new ListData(getRandomWelcomeTips(),ListData.RECEIVE, getTime());
        lists.add(listData);//��ӻ�ӭ��
    }

    /**
     * ���û�ӭ��
     */
    public String getRandomWelcomeTips(){
    
//        String welcome_tip = null;
//        welcome_arry = this.getResources().getStringArray(getResources().getString(R.string.welcome_tips));//��string.xml�л�ȡ��Ϊwelcome_tips���ַ�������
//        int index = (int)(Math.random()*(welcome_arry.length - 1));//��ȡһ�������
//        welcome_tip = welcome_arry[index];
        return getResources().getString(R.string.welcome_tips);
    }

    /**
     * ����ʱ��
     * @return
     */
    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 >= 5*60*1000){
    //�������5���ӣ���ʾʱ��
            oldTime = currentTime;
            return str;
        }else{
    
            return "";
        }
    }


    @Override
    public void getDataUrl(String data) {
    
        Log.i("haha---data=","------" + data);
        parseText(data);
    }

    public void parseText(String str){
    //����json
        try {
    
            JSONObject jb = new JSONObject(str);
            ListData listData;
            listData = new ListData(jb.getString("text"),ListData.RECEIVE, getTime());
            lists.add(listData);
            adapter.notifyDataSetChanged();//�����m�䣿��
        } catch (JSONException e) {
    
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
    
        getTime();//����ʱ��
        content_str = et_sendText.getText().toString();//�@ȡEditText����
        et_sendText.setText("");
        String dropk = content_str.replace(" ", "");//ȥ���ո�
        String droph = dropk.replace("\n", "");//ȥ���س�
        ListData listData;
        listData = new ListData(content_str, ListData.SEND, getTime());
        lists.add(listData);
        Log.i("haha9", "----------content_str="+content_str);
        adapter.notifyDataSetChanged();//ˢ��

        Log.i("haha6", "----------content_str="+content_str);

        httpData = (HttpData) new HttpData(
                "http://www.tuling123.com/openapi/api?key=02dfb86de93f8a3e81dabd214a50c8fa&info=" + droph + "&userid=15602229049",
                this).execute();// �����Ѿ�ȥ���ո�ͻس�content_str������droph   ; execute()�����첽ͨ��

        Log.i("haha5", "----------"+httpData);

        if(lists.size() > 30){
    //�����Ļ�ϵĶԻ����ݶ���30�����Ƴ�ǰ�������
            for (int i = 0; i < lists.size(); i++) {
    
                lists.remove(i);
            }
        }
    }

}

11.还需要注意申请网络权限,放在AndroidManifest.xml中

  <uses-permission android:name="android.permission.INTERNET" />

四、资源下载

下载地址:Android开发之智能聊天机器人
至此,一个智能聊天机器人就实现了,你可以尽情的和它玩耍了,记住别玩坏了哦
不懂的地方可以问我哦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_61963074/article/details/126200406

智能推荐

鸿蒙系统可以替代安卓吗,华为今天发布的鸿蒙系统,到底能不能替代安卓?-程序员宅基地

文章浏览阅读570次。对于大部分差友们来说,“开发者大会”这个词一定显得陌生而又遥远,跟普通的产品发布会不一样,他们面向的对象并不是普通的消费者,而是各种程序猿和攻城狮。话又说回来,能开“ 开发者大会”,也说明这个企业已经牛逼到了一定程度。。譬如每年的谷歌开发者大会,苹果的WWDC 都受到超多人关注,因为千千万万开发者就是依靠着安卓和iOS 生态创造价值,它们的任何更新和变动都引领着未来互联网的走向。这种会议完全是企业..._华为鸿蒙系统能代替安卓吗

Linux运行jar包命令_linux执行jar包命令带参数-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏23次。一. linux下运行jar包的命令1、java -jar xxxxx.jar // 当前xshell窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出2、java -jar xxxxx.jar & //当前shell窗口不被锁定,但是当窗口关闭时,程序中止运行。3、nohup Java -jar xxxxxx.jar & //意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行二. 下面详细介绍第三种运行方式/*下面介绍如何关闭第三种运行的jar包程序/_linux执行jar包命令带参数

C#LeetCode刷题之#344-反转字符串​​​​​​​(Reverse String)_c#将任意字符串反转输出-程序员宅基地

文章浏览阅读1.2w次。问题编写一个函数,其作用是将输入的字符串反转过来。输入: "hello"输出: "olleh"输入: "A man, a plan, a canal: Panama"输出: "amanaP :lanac a ,nalp a ,nam A"Write a function that takes a string as input and returns the str..._c#将任意字符串反转输出

实现游戏数据文件读取和写入_游戏data文件怎么编辑-程序员宅基地

文章浏览阅读1.6k次。前言 关于代码与文件交互方式的选择,基本常用的有以下三种,与txt格式的文本文件交互,与ini格式的配置文件交互,与xml类型的文件交互。考虑到交互数据为游戏数据,因此采用第3种。文本利用C#的正反序列化技术来实现游戏数据文件的读取和写入。准备工作 本人使用的开发环境为VisualStudio2019..._游戏data文件怎么编辑

hive if 用法-程序员宅基地

文章浏览阅读4.2w次,点赞6次,收藏20次。1.If函数:if和case差不多,都是处理单个列的查询结果语法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)返回值: T说明:当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNull举例:if(条件表达式,结果1,结果2)相当于java中的三目运算符..._hive if

如何做好腾讯视频号?腾讯视频号的机会!_腾讯视频号服务外包怎么做-程序员宅基地

文章浏览阅读1k次。腾讯扩大了视频号的内测范围,很多的朋友都收到了视频号的邀请,每个人都觉得视频号是一个创业的契机,最起码站在了风口的边缘,似乎明天注册公司,后天就能出任CEO迎接白富美了。对于视频号的这个机会,很不好意思,我先帮您泼一盆冷水,没有正确的追风的姿势,最后还是安然离场! 历来的风口,抓住了哪个? 从微博到公众号,从公众号到头条,从头条到抖音,每一次都是一个机会,现在看看很多人还不是一样,看..._腾讯视频号服务外包怎么做

随便推点

信号完整性之阻抗匹配与端接方法_传输线的阻抗匹配和端接方式-程序员宅基地

文章浏览阅读9.4k次,点赞15次,收藏98次。信号完整性之阻抗匹配与端接方法1. 前言随着电子技术的发展,电路的规模越来越大,单个器件集成的功能越来越多,速率越来越高,而器件的尺寸越来越小。由于器件尺寸的减小,器件引脚信号变化沿的速率变得越来越高,导致SI问题越来越突出。SI (Signal Integrity,信号完整性)与以下几个因素有关:反射、串扰、辐射。反射是由信号传输路径上的阻抗不连续造成的;串扰与信号的间距有关;辐射则与高速器件自身以及PCB设计均有关。2. 信号的阻抗匹配信号的阻抗匹配是影响信号完整性最主要的._传输线的阻抗匹配和端接方式

Ae 入门系列之一:了解 Ae 及工作流程-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏5次。Adobe After Efftects(简称为 Ae )可以帮助用户高效且精确地创建无数种引人注目的动态图形和震撼人心的视觉效果,利用与其他 Adobe 软件紧密集成和高度灵活的二维和三..._ae视频渲染从入门到精通 csdn

Android进程间通信--消息机制及IPC机制实现_ipc机制和消息机制-程序员宅基地

文章浏览阅读479次。Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信!组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Service,不论这个Activity或Service是属于当前应用还是其它应用的! _ipc机制和消息机制

mysql中文编码问题-程序员宅基地

文章浏览阅读38次。我比较推荐的方法是在创建数据库时便设置中文编码create database bp default character set utf8; #注意是utf8不是utf-8以下方法只适用于mysql5.5以上版本的(其实我的是mariadb5.5版本的) 编辑mysql配置文件[root@localhost ~]# cat /etc/my.cnf..._群晖 mysql5.6 中文乱码

HRNet提取骨架特征点+ ST-GCN训练自己的数据集代码实践问题记录-程序员宅基地

文章浏览阅读1w次,点赞12次,收藏140次。软硬件环境:python 3.6.5Ubuntu 18.04 LTSPytorch 1.1.0NVIDIA TITAN XP 8GB项目链接https://github.com/open-mmlab/mmskeleton准备工作先准备数据集准备环境,包含两步:第一步: 进入文件夹./deprecated/origin_stgcn_repo/ ,打开requirements.txt看下需要满足的环境条件,conda list:我不直接安装requirements.txt中的需求原因是,_hrnet提取骨架

分支限界法TSP问题-程序员宅基地

文章浏览阅读1.7k次。分支限界法TSP问题//分支限界法#include<iostream>#include<algorithm>#include<cstdio>#include<queue>const int INF = 100000;const int MAX_N = 22;using namespace std;//n*n的一个矩阵int n;int cost[MAX_N][MAX_N];//最少3个点,最多MAX_N个点struct Node{