转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38498353 ,本文出自:【张鸿洋的博客】

今天看到一个ios写的图灵机器人,直接去官网(http://www.tuling123.com/openapi/)看了下API接入,太简单了,就一个get请求~于是乎。写了一个Android版本号的机器人,没什么技术含量,可是挺好玩的~刚好昨晚看了自己喜欢的秦时明月。嘿嘿,小貔貅,就是我的机器人宠物啦~

1、效果图

先看看效果图:

当然不仅是闲聊,还有更强大的。见下图:

好了,效果图就先这样了,有兴趣的自己去研究下。还支持自己主动学习噢 ~

以下開始代码了~

2、布局文件

主界面消息的显示是一个ListView,只是这个listView中的Item有两种风格。一个是左边的绿色消息,一个是右边的白色消息

左边的消息布局文件:

  1. <?xml version="1.0" encoding="utf-8"?
  2.  
  3. >
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:orientation="vertical" >
  8.  
  9. <TextView
  10. android:id="@+id/chat_from_createDate"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="2012-09-01 18:30:20"
  14. style="@style/chat_date_style"
  15. />
  16.  
  17. <LinearLayout
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:orientation="horizontal" >
  21.  
  22. <LinearLayout
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_marginLeft="10dp"
  26. android:orientation="vertical" >
  27.  
  28. <ImageView
  29. android:id="@+id/chat_from_icon"
  30. android:layout_width="49dp"
  31. android:layout_height="49dp"
  32. android:src="@drawable/icon" />
  33.  
  34. <TextView
  35. android:id="@+id/chat_from_name"
  36. android:layout_width="wrap_content"
  37. android:layout_height="wrap_content"
  38. android:layout_gravity="center"
  39. android:text="小貅貅"
  40. android:textSize="18sp" />
  41. </LinearLayout>
  42.  
  43. <TextView
  44. android:id="@+id/chat_from_content"
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:minHeight="50dp"
  48. android:background="@drawable/chat_from_msg"
  49. android:text="有大吗。。。
  50.  
  51. "
  52. android:textSize="18sp"
  53. android:textColor="#000"
  54. android:gravity="center_vertical"
  55. android:focusable="true"
  56. android:clickable="true"
  57. android:lineSpacingExtra="2dp"
  58. />
  59. </LinearLayout>
  60.  
  61. </LinearLayout>

右边的和左边基本一致,就不贴了。最后会给出代码。

主布局文件:

  1. <?
  2.  
  3. xml version="1.0" encoding="utf-8"?>
  4. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="@drawable/chat_bg_default"
  8. android:orientation="vertical" >
  9.  
  10. <RelativeLayout
  11. android:id="@+id/ly_chat_title"
  12. android:layout_width="fill_parent"
  13. android:layout_height="45dp"
  14. android:background="@drawable/title_bar" >
  15.  
  16. <TextView
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent"
  19. android:gravity="center"
  20. android:text="小貔貅"
  21. android:textColor="#fff"
  22. android:textSize="20sp"
  23. android:textStyle="bold" />
  24. </RelativeLayout>
  25.  
  26. <RelativeLayout
  27. android:id="@+id/ly_chat_bottom"
  28. android:layout_width="fill_parent"
  29. android:layout_height="55dp"
  30. android:layout_alignParentBottom="true"
  31. android:background="@drawable/bottom_bar" >
  32.  
  33. <Button
  34. android:id="@+id/id_chat_send"
  35. android:layout_width="60dp"
  36. android:layout_height="40dp"
  37. android:layout_alignParentRight="true"
  38. android:layout_centerVertical="true"
  39. android:layout_marginRight="10dp"
  40. android:background="@drawable/chat_send_btn"
  41. android:onClick="sendMessage"
  42. android:text="发送" />
  43.  
  44. <EditText
  45. android:id="@+id/id_chat_msg"
  46. android:layout_width="fill_parent"
  47. android:layout_height="40dp"
  48. android:layout_centerVertical="true"
  49. android:layout_marginLeft="10dp"
  50. android:layout_marginRight="10dp"
  51. android:layout_toLeftOf="@id/id_chat_send"
  52. android:background="@drawable/login_edit_normal"
  53. android:singleLine="true"
  54. android:textSize="18sp" />
  55. </RelativeLayout>
  56.  
  57. <ListView
  58. android:id="@+id/id_chat_listView"
  59. android:layout_width="fill_parent"
  60. android:layout_height="fill_parent"
  61. android:layout_above="@id/ly_chat_bottom"
  62. android:layout_below="@id/ly_chat_title"
  63. android:cacheColorHint="#0000"
  64. android:divider="@null"
  65. android:dividerHeight="5dp"
  66. android:scrollbarStyle="outsideOverlay" >
  67. </ListView>
  68.  
  69. </RelativeLayout>

就是ListView和以下的消息框和消息button了~没撒好说的

3、HttpUtils

封装了一个用于訪问API的工具类,事实上就一个Get请求:

  1. package com.zhy.utils;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.UnsupportedEncodingException;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;
  9. import java.net.URLEncoder;
  10. import java.util.Date;
  11.  
  12. import com.example.android_robot_01.bean.ChatMessage;
  13. import com.example.android_robot_01.bean.ChatMessage.Type;
  14. import com.example.android_robot_01.bean.CommonException;
  15. import com.example.android_robot_01.bean.Result;
  16. import com.google.gson.Gson;
  17.  
  18. public class HttpUtils
  19. {
  20. private static String API_KEY = "534dc342ad15885dffc10d7b5f813451";
  21. private static String URL = "http://www.tuling123.com/openapi/api";
  22.  
  23. /**
  24. * 发送一个消息。并得到返回的消息
  25. * @param msg
  26. * @return
  27. */
  28. public static ChatMessage sendMsg(String msg)
  29. {
  30. ChatMessage message = new ChatMessage();
  31. String url = setParams(msg);
  32. String res = doGet(url);
  33. Gson gson = new Gson();
  34. Result result = gson.fromJson(res, Result.class);
  35.  
  36. if (result.getCode() > 400000 || result.getText() == null
  37. || result.getText().trim().equals(""))
  38. {
  39. message.setMsg("该功能等待开发...");
  40. }else
  41. {
  42. message.setMsg(result.getText());
  43. }
  44. message.setType(Type.INPUT);
  45. message.setDate(new Date());
  46.  
  47. return message;
  48. }
  49.  
  50. /**
  51. * 拼接Url
  52. * @param msg
  53. * @return
  54. */
  55. private static String setParams(String msg)
  56. {
  57. try
  58. {
  59. msg = URLEncoder.encode(msg, "UTF-8");
  60. } catch (UnsupportedEncodingException e)
  61. {
  62. e.printStackTrace();
  63. }
  64. return URL + "?key=" + API_KEY + "&info=" + msg;
  65. }
  66.  
  67. /**
  68. * Get请求。获得返回数据
  69. * @param urlStr
  70. * @return
  71. */
  72. private static String doGet(String urlStr)
  73. {
  74. URL url = null;
  75. HttpURLConnection conn = null;
  76. InputStream is = null;
  77. ByteArrayOutputStream baos = null;
  78. try
  79. {
  80. url = new URL(urlStr);
  81. conn = (HttpURLConnection) url.openConnection();
  82. conn.setReadTimeout(5 * 1000);
  83. conn.setConnectTimeout(5 * 1000);
  84. conn.setRequestMethod("GET");
  85. if (conn.getResponseCode() == 200)
  86. {
  87. is = conn.getInputStream();
  88. baos = new ByteArrayOutputStream();
  89. int len = -1;
  90. byte[] buf = new byte[128];
  91.  
  92. while ((len = is.read(buf)) != -1)
  93. {
  94. baos.write(buf, 0, len);
  95. }
  96. baos.flush();
  97. return baos.toString();
  98. } else
  99. {
  100. throw new CommonException("server连接错误!
  101.  
  102. ");
  103. }
  104.  
  105. } catch (Exception e)
  106. {
  107. e.printStackTrace();
  108. throw new CommonException("server连接错误!");
  109. } finally
  110. {
  111. try
  112. {
  113. if (is != null)
  114. is.close();
  115. } catch (IOException e)
  116. {
  117. e.printStackTrace();
  118. }
  119.  
  120. try
  121. {
  122. if (baos != null)
  123. baos.close();
  124. } catch (IOException e)
  125. {
  126. e.printStackTrace();
  127. }
  128. conn.disconnect();
  129. }
  130.  
  131. }
  132.  
  133. }

暴露出去的,就是sendMsg这个静态方法。当然将返回的数据也直接封装成了ChatMessage

4、ChatMessage

  1. package com.example.android_robot_01.bean;
  2.  
  3. import java.text.DateFormat;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6.  
  7. public class ChatMessage
  8. {
  9.  
  10. /**
  11. * 消息类型
  12. */
  13. private Type type ;
  14. /**
  15. * 消息内容
  16. */
  17. private String msg;
  18. /**
  19. * 日期
  20. */
  21. private Date date;
  22. /**
  23. * 日期的字符串格式
  24. */
  25. private String dateStr;
  26. /**
  27. * 发送人
  28. */
  29. private String name;
  30.  
  31. public enum Type
  32. {
  33. INPUT, OUTPUT
  34. }
  35.  
  36. public ChatMessage()
  37. {
  38. }
  39.  
  40. public ChatMessage(Type type, String msg)
  41. {
  42. super();
  43. this.type = type;
  44. this.msg = msg;
  45. setDate(new Date());
  46. }
  47.  
  48. public String getDateStr()
  49. {
  50. return dateStr;
  51. }
  52.  
  53. public Date getDate()
  54. {
  55. return date;
  56. }
  57.  
  58. public void setDate(Date date)
  59. {
  60. this.date = date;
  61. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  62. this.dateStr = df.format(date);
  63.  
  64. }
  65.  
  66. public String getName()
  67. {
  68. return name;
  69. }
  70.  
  71. public void setName(String name)
  72. {
  73. this.name = name;
  74. }
  75.  
  76. public Type getType()
  77. {
  78. return type;
  79. }
  80.  
  81. public void setType(Type type)
  82. {
  83. this.type = type;
  84. }
  85.  
  86. public String getMsg()
  87. {
  88. return msg;
  89. }
  90.  
  91. public void setMsg(String msg)
  92. {
  93. this.msg = msg;
  94. }
  95.  
  96. }

都没撒好说的。非常easy~

5、主Activity

  1. package com.example.android_robot_01;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6.  
  7. import android.app.Activity;
  8. import android.content.Context;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.text.TextUtils;
  13. import android.view.View;
  14. import android.view.Window;
  15. import android.view.inputmethod.InputMethodManager;
  16. import android.widget.EditText;
  17. import android.widget.ListView;
  18. import android.widget.Toast;
  19.  
  20. import com.example.android_robot_01.bean.ChatMessage;
  21. import com.example.android_robot_01.bean.ChatMessage.Type;
  22. import com.zhy.utils.HttpUtils;
  23.  
  24. public class MainActivity extends Activity
  25. {
  26. /**
  27. * 展示消息的listview
  28. */
  29. private ListView mChatView;
  30. /**
  31. * 文本域
  32. */
  33. private EditText mMsg;
  34. /**
  35. * 存储聊天消息
  36. */
  37. private List<ChatMessage> mDatas = new ArrayList<ChatMessage>();
  38. /**
  39. * 适配器
  40. */
  41. private ChatMessageAdapter mAdapter;
  42.  
  43. private Handler mHandler = new Handler()
  44. {
  45. public void handleMessage(android.os.Message msg)
  46. {
  47. ChatMessage from = (ChatMessage) msg.obj;
  48. mDatas.add(from);
  49. mAdapter.notifyDataSetChanged();
  50. mChatView.setSelection(mDatas.size() - 1);
  51. };
  52. };
  53.  
  54. @Override
  55. protected void onCreate(Bundle savedInstanceState)
  56. {
  57. super.onCreate(savedInstanceState);
  58. requestWindowFeature(Window.FEATURE_NO_TITLE);
  59. setContentView(R.layout.main_chatting);
  60.  
  61. initView();
  62.  
  63. mAdapter = new ChatMessageAdapter(this, mDatas);
  64. mChatView.setAdapter(mAdapter);
  65.  
  66. }
  67.  
  68. private void initView()
  69. {
  70. mChatView = (ListView) findViewById(R.id.id_chat_listView);
  71. mMsg = (EditText) findViewById(R.id.id_chat_msg);
  72. mDatas.add(new ChatMessage(Type.INPUT, "我是小貅貅。非常高兴为您服务"));
  73. }
  74.  
  75. public void sendMessage(View view)
  76. {
  77. final String msg = mMsg.getText().toString();
  78. if (TextUtils.isEmpty(msg))
  79. {
  80. Toast.makeText(this, "您还没有填写信息呢...", Toast.LENGTH_SHORT).show();
  81. return;
  82. }
  83.  
  84. ChatMessage to = new ChatMessage(Type.OUTPUT, msg);
  85. to.setDate(new Date());
  86. mDatas.add(to);
  87.  
  88. mAdapter.notifyDataSetChanged();
  89. mChatView.setSelection(mDatas.size() - 1);
  90.  
  91. mMsg.setText("");
  92.  
  93. // 关闭软键盘
  94. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  95. // 得到InputMethodManager的实例
  96. if (imm.isActive())
  97. {
  98. // 假设开启
  99. imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
  100. InputMethodManager.HIDE_NOT_ALWAYS);
  101. // 关闭软键盘。开启方法同样,这种方法是切换开启与关闭状态的
  102. }
  103.  
  104. new Thread()
  105. {
  106. public void run()
  107. {
  108. ChatMessage from = null;
  109. try
  110. {
  111. from = HttpUtils.sendMsg(msg);
  112. } catch (Exception e)
  113. {
  114. from = new ChatMessage(Type.INPUT, "server挂了呢...");
  115. }
  116. Message message = Message.obtain();
  117. message.obj = from;
  118. mHandler.sendMessage(message);
  119. };
  120. }.start();
  121.  
  122. }
  123.  
  124. }

为ListView设置数据。一開始就设置了第一句话“我是小貅貅。非常高兴为您服务”。还有就是sendButton的事件处理。

6、适配器

  1. package com.example.android_robot_01;
  2.  
  3. import java.util.List;
  4.  
  5. import android.content.Context;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.TextView;
  11.  
  12. import com.example.android_robot_01.bean.ChatMessage;
  13. import com.example.android_robot_01.bean.ChatMessage.Type;
  14.  
  15. public class ChatMessageAdapter extends BaseAdapter
  16. {
  17. private LayoutInflater mInflater;
  18. private List<ChatMessage> mDatas;
  19.  
  20. public ChatMessageAdapter(Context context, List<ChatMessage> datas)
  21. {
  22. mInflater = LayoutInflater.from(context);
  23. mDatas = datas;
  24. }
  25.  
  26. @Override
  27. public int getCount()
  28. {
  29. return mDatas.size();
  30. }
  31.  
  32. @Override
  33. public Object getItem(int position)
  34. {
  35. return mDatas.get(position);
  36. }
  37.  
  38. @Override
  39. public long getItemId(int position)
  40. {
  41. return position;
  42. }
  43.  
  44. /**
  45. * 接受到消息为1,发送消息为0
  46. */
  47. @Override
  48. public int getItemViewType(int position)
  49. {
  50. ChatMessage msg = mDatas.get(position);
  51. return msg.getType() == Type.INPUT ?
  52.  
  53. 1 : 0;
  54. }
  55.  
  56. @Override
  57. public int getViewTypeCount()
  58. {
  59. return 2;
  60. }
  61.  
  62. @Override
  63. public View getView(int position, View convertView, ViewGroup parent)
  64. {
  65. ChatMessage chatMessage = mDatas.get(position);
  66.  
  67. ViewHolder viewHolder = null;
  68.  
  69. if (convertView == null)
  70. {
  71. viewHolder = new ViewHolder();
  72. if (chatMessage.getType() == Type.INPUT)
  73. {
  74. convertView = mInflater.inflate(R.layout.main_chat_from_msg,
  75. parent, false);
  76. viewHolder.createDate = (TextView) convertView
  77. .findViewById(R.id.chat_from_createDate);
  78. viewHolder.content = (TextView) convertView
  79. .findViewById(R.id.chat_from_content);
  80. convertView.setTag(viewHolder);
  81. } else
  82. {
  83. convertView = mInflater.inflate(R.layout.main_chat_send_msg,
  84. null);
  85.  
  86. viewHolder.createDate = (TextView) convertView
  87. .findViewById(R.id.chat_send_createDate);
  88. viewHolder.content = (TextView) convertView
  89. .findViewById(R.id.chat_send_content);
  90. convertView.setTag(viewHolder);
  91. }
  92.  
  93. } else
  94. {
  95. viewHolder = (ViewHolder) convertView.getTag();
  96. }
  97.  
  98. viewHolder.content.setText(chatMessage.getMsg());
  99. viewHolder.createDate.setText(chatMessage.getDateStr());
  100.  
  101. return convertView;
  102. }
  103.  
  104. private class ViewHolder
  105. {
  106. public TextView createDate;
  107. public TextView name;
  108. public TextView content;
  109. }
  110.  
  111. }

唯一须要注意的是,由于我们的ListView的Item有两种显示风格,所以比平时我们须要多重写两个方法:

  1. /**
  2. * 接受到消息为1。发送消息为0
  3. */
  4. @Override
  5. public int getItemViewType(int position)
  6. {
  7. ChatMessage msg = mDatas.get(position);
  8. return msg.getType() == Type.INPUT ? 1 : 0;
  9. }
  10.  
  11. @Override
  12. public int getViewTypeCount()
  13. {
  14. return 2;
  15. }

getViewTypeCount返回的就是种类数目了;getItemViewType依据当然Item的position决定返回不同的整型变量。然后在getView中,依据消息的类型去载入不同的Item布局就可以。

基本上也就完工了,没啥技术含量,纯属娱乐。各位程序员兄,没事能够花点时间写下玩一玩~劳逸结合下~

源代码点击下载

Android 智能问答机器人的实现的更多相关文章

  1. Android之智能问答机器人

    本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...

  2. Android智能聊天机器人

    http://www.tuling123.com/       注册一个账号,申请一个KEY值.此网站也有文档,可以查看. package com.tulingdemo; import java.te ...

  3. 自己动手开发智能聊天机器人完全指南(附python完整源码)

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  4. 【Android开发】问答机器人,聊天类App的开发制作过程记录

    缘起 很久没写项目了,所以单纯的想练练手,正好看到有问答机器人的接口,想到之前也做过聊天项目,为什么不实验一下呢.当然也是简单调用接口的项目,并没有真正的完成问答的算法等等.业余项目,功能不齐全,只实 ...

  5. 图灵机器人(问答机器人)API调用示例

    问答机器人API文档:https://www.juhe.cn/docs/api/id/112 先上图: 说下大致实现的步骤: 1.首先使用了聚合数据的sdk,这样免费使用的数目可以多一些 2.使用gs ...

  6. 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统

    基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...

  7. 用人工智能学习,凡亿推出PCB问题解答智能搜索机器人:pcb助手

    对于学习者,你是不是经常遇到这样的问题:在我们狠狠下定决心学习PCB技术的时候,我们常常遇到很多大大小小的问题,遗憾的是身边没有一个能及时给自己解答问题的高手指点,通过论坛.群等方式询问可能半天也得不 ...

  8. 利用问答机器人API开发制作聊天类App

    缘起 很久没写项目了,所以单纯的想练练手,正好看到有问答机器人的接口,想到之前也做过聊天项目,为什么不实验一下呢.当然也是简单调用接口的项目,并没有真正的完成问答的算法等等.业余项目,功能不齐全,只实 ...

  9. AI中台——智能聊天机器人平台的架构与应用(分享实录)

    内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取 ...

随机推荐

  1. eclipse中同步代码PULL报错checkout conflict with files的解决方法

    1.Team--->Synchronize Workspace 2.在同步窗口找到冲突文件,把自己本地修改的复制出来 3.在文件上右键选择 Overwrite----->Yes , 4.再 ...

  2. javascript的prototype经典使用场景

    prototype的经典使用场景就是为对象增加属性和方法,如给自定义的Man对象增加个姓名属性和语言方法: function man() {        this.age = "22&qu ...

  3. uva 10596 - Morning Walk

    Problem H Morning Walk Time Limit 3 Seconds Kamal is a Motashota guy. He has got a new job in Chitta ...

  4. SpringMVC参数接收

    1 绑定简单类型 要根据id查询商品数据,需要从请求的参数中把请求的id取出来.Id应该包含在Request对象中.可以从Request对象中取id. public ModelAndView item ...

  5. Maximun product

    Given a sequence of integers S = {S1, S2, ..., Sn}, you shoulddetermine what is the value of the max ...

  6. SQlServer中的MD5加密

    SELECT sys.fn_varbintohexstr(HASHBYTES('MD5', '我'));

  7. 将scl分频

    多个scl后一个高脉冲,脉冲宽度一个scl脉冲. always @ ( posedge MCLK or negedge RST_N ) begin if (rClkCount == 24) //如果有 ...

  8. 自动生成 serialVersionUID 的设置

    1 把鼠标放在类名上,会出现小灯泡的形状 点击 Add ‘serialVersionUID’ field... 即可生成 如果鼠标放在类名上没有出现 Add ‘serialVersionUID’ fi ...

  9. Python+selenium下拉菜单选项

    案例:在我要自学网登录页面选择要保留的时间 具体页面如图所示: 使用前端工具查看部分页面代码: <select class="loinp" name="Cookie ...

  10. HTML文件中css样式的引用

    1.1.直接在div中使用css样式制作div+css网页 如: <div style="font-size:14px; color:#FF0000;">内容</ ...