前二天,看了Android 智能问答机器人的实现的博文,我们可以进入图灵机器人主页,根据平台接入的介绍,我们知道,主是要在客户端按一定的格式(key 必须 + userid get 非必须,上下文功能必须 +info get 必须,请求内容 + loc get 非必须,位置信息 + lon get 非必须,经度 + lat get 非必须,纬度,),发送一个消息请求(请求方式: http get),数据返回(JSON格式),所以, 我只要解析返回的json格式的数据,并根据返回的数据返回码(code),来分类解析对应种类的数据,并把他们显示出来就OK了。

上一篇博文是api接入,是自己写的一个http get方法,在这个例子中,本来我打算采用官方的java平台接入,发现官方给的api有问题,我就参照网上的资料,自己写了一个api接入方法,有兴趣的,可以看看。

1.效果图:

2.MainActivity.java----主界面类

这个界面,主要是一个listview--显示用户和机器人的对话信息,还有一个就是edittext和发送button.

package com.example.smartrobot;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.example.smartrobot.ChatMessage.Type;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;//http://blog.csdn.net/lmj623565791/article/details/38498353
//http://www.tuling123.com/openapi/cloud/access_api.jsp
//http://tech.ddvip.com/2013-08/1375807684200390.htmlpublic class MainActivity extends Activity
{private ListView mChatView;private EditText mMsg;private List<ChatMessage> mDatas = new ArrayList<ChatMessage>();private ChatMessageAdapter mAdapter;private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg){ChatMessage from = (ChatMessage) msg.obj;mDatas.add(from);mAdapter.notifyDataSetChanged();mChatView.setSelection(mDatas.size() - 1);};};@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main_chatting);       initView();     mAdapter = new ChatMessageAdapter(this, mDatas);mChatView.setAdapter(mAdapter);}private void initView(){mChatView = (ListView) findViewById(R.id.id_chat_listView);mMsg = (EditText) findViewById(R.id.id_chat_msg);mDatas.add(new ChatMessage(Type.INPUT, "hello,I'm very glad to serve you"));}public void sendMessage(View view){final String msg = mMsg.getText().toString();if (TextUtils.isEmpty(msg)){Toast.makeText(this, "You do not have to fill in the information", Toast.LENGTH_SHORT).show();return;}ChatMessage to = new ChatMessage(Type.OUTPUT, msg);to.setDate(new Date());mDatas.add(to);mAdapter.notifyDataSetChanged();mChatView.setSelection(mDatas.size() - 1);mMsg.setText("");new Thread(){public void run(){ChatMessage from = null;try{//from = HttpUtils.sendMsg(msg);from = HttpUtils.sendMessageByExample(msg);} catch (Exception e){from = new ChatMessage(Type.INPUT, "Server hang...");}Message message = Message.obtain();message.obj = from;mHandler.sendMessage(message);};}.start();}
}

3.HttpUtils.java-----消息接受和解析类

其中方法sendMsg和sendMessageByExample是验证可用的方法,但是参考官方文档的java接入api:  sendMessageByExample02测试通不过。

package com.example.smartrobot;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;import android.util.Log;import com.example.smartrobot.ChatMessage.Type;
import com.google.gson.Gson;public class HttpUtils
{public static final String TAG = "HttpUtils";public static String API_KEY = "534dc342ad15885dffc10d7b5f813451";  public static final String api_key_my = "5c21eaa5c118d25065c3e1f058942581";  public static String URL = "http://www.tuling123.com/openapi/api";public static ChatMessage sendMsg(String msg){ChatMessage message = new ChatMessage();String url = setParams(msg);String res = doGet(url);Gson gson = new Gson();Result result = gson.fromJson(res, Result.class);String text = null;if (result.getCode() > 400000 || result.getText() == null|| result.getText().trim().equals("")){text = "The function waiting for the development ...";}else{text = result.getText();}message.setMsg(text);message.setType(Type.INPUT);message.setDate(new Date());       return message;}private static String setParams(String msg){try{msg = URLEncoder.encode(msg, "UTF-8");} catch (UnsupportedEncodingException e){e.printStackTrace();}return URL + "?key=" + API_KEY + "&info=" + msg;}private static String doGet(String urlStr){URL url = null;HttpURLConnection conn = null;InputStream is = null;ByteArrayOutputStream baos = null;try{url = new URL(urlStr);conn = (HttpURLConnection) url.openConnection();conn.setReadTimeout(5 * 1000);conn.setConnectTimeout(5 * 1000);conn.setRequestMethod("GET");if (conn.getResponseCode() == 200){is = conn.getInputStream();baos = new ByteArrayOutputStream();int len = -1;byte[] buf = new byte[128];while ((len = is.read(buf)) != -1){baos.write(buf, 0, len);}baos.flush();return baos.toString();} else{throw new CommonException("The server connection error");}} catch (Exception e){e.printStackTrace();throw new CommonException("The server connection error");} finally{try{if (is != null)is.close();} catch (IOException e){e.printStackTrace();}try{if (baos != null)baos.close();} catch (IOException e){e.printStackTrace();}conn.disconnect();}}public static ChatMessage sendMessageByExample(String msg){ChatMessage message = new ChatMessage();     String requesturl = setParams(msg);            String res = doGetByExample(requesturl);message.setMsg(res);message.setType(Type.INPUT);message.setDate(new Date());       return message;}private static String doGetByExample(String requesturl) {// TODO Auto-generated method stub HttpGet request = new HttpGet(requesturl); HttpResponse response = null;try {     HttpClient httpClient = new DefaultHttpClient();    response = httpClient.execute(request);   Log.i(TAG, "response.toString():"+response.toString());} catch (ClientProtocolException e) {// TODO Auto-generated catch blockLog.i(TAG, "e--2:"+e.toString());e.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blockLog.i(TAG, "e--3:"+e.toString());e.printStackTrace();return null;}       //200 is right return codesif(response.getStatusLine().getStatusCode() == 200){ try {String res = EntityUtils.toString(response.getEntity());Log.i(TAG, "res:"+res);Gson gson = new Gson();Result result = gson.fromJson(res, Result.class);Log.i(TAG, "result.toString():"+result.toString());if (result.getCode() > 400000 || result.getText() == null|| result.getText().trim().equals("")){return "The function waiting for the development ...";}else{Log.i(TAG, "result.getText():"+result.getText());return result.getText();                 }           } catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}}else{return null;}}public static ChatMessage sendMessageByExample02(String msg){ChatMessage message = new ChatMessage();        String requesturl = setParams(msg);            HttpGet request = new HttpGet(requesturl); HttpResponse response = null;try {response = HttpClients.createDefault().execute(request);} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} String result = null;//200 is right return codesif(response.getStatusLine().getStatusCode() == 200){             try {result = EntityUtils.toString(response.getEntity());} catch (ParseException e) {// TODO Auto-generated catch blockLog.i(TAG, "e--4:"+e.toString());e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blockLog.i(TAG, "e--5:"+e.toString());e.printStackTrace();} }else{result = "The function waiting for the development ...";}         message.setMsg(result);message.setType(Type.INPUT);message.setDate(new Date());     return message;}
}

4.ChatMessage----消息类的对象

package com.example.smartrobot;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;public class ChatMessage
{private Type type ;private String msg;private Date date;private String dateStr;private String name;public enum Type{INPUT, OUTPUT}public ChatMessage(){}public ChatMessage(Type type, String msg){super();this.type = type;this.msg = msg;setDate(new Date());}public String getDateStr(){return dateStr;}public Date getDate(){return date;}public void setDate(Date date){this.date = date;DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");this.dateStr = df.format(date);}public String getName(){return name;}public void setName(String name){this.name = name;}public Type getType(){return type;}public void setType(Type type){this.type = type;}public String getMsg(){return msg;}public void setMsg(String msg){this.msg = msg;}}

5.ChatMessageAdapter.java----listview的适配器

package com.example.smartrobot;import java.util.List;
import com.example.smartrobot.ChatMessage.Type;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;public class ChatMessageAdapter extends BaseAdapter
{private LayoutInflater mInflater;private List<ChatMessage> mDatas;public ChatMessageAdapter(Context context, List<ChatMessage> datas){mInflater = LayoutInflater.from(context);mDatas = datas;}@Overridepublic int getCount(){return mDatas.size();}@Overridepublic Object getItem(int position){return mDatas.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic int getItemViewType(int position){ChatMessage msg = mDatas.get(position);return msg.getType() == Type.INPUT ? 1 : 0;}@Overridepublic int getViewTypeCount(){return 2;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){ChatMessage chatMessage = mDatas.get(position);ViewHolder viewHolder = null;if (convertView == null){viewHolder = new ViewHolder();if (chatMessage.getType() == Type.INPUT){convertView = mInflater.inflate(R.layout.main_chat_from_msg,parent, false);viewHolder.createDate = (TextView) convertView.findViewById(R.id.chat_from_createDate);viewHolder.content = (TextView) convertView.findViewById(R.id.chat_from_content);convertView.setTag(viewHolder);} else{convertView = mInflater.inflate(R.layout.main_chat_send_msg,null);viewHolder.createDate = (TextView) convertView.findViewById(R.id.chat_send_createDate);viewHolder.content = (TextView) convertView.findViewById(R.id.chat_send_content);convertView.setTag(viewHolder);}} else{viewHolder = (ViewHolder) convertView.getTag();}viewHolder.content.setText(chatMessage.getMsg());viewHolder.createDate.setText(chatMessage.getDateStr());return convertView;}private class ViewHolder{public TextView createDate;public TextView name;public TextView content;}
}

6.Result----解析返回的json数据

package com.example.smartrobot;public class Result
{private int code;private String text;public Result(){}public Result(int resultCode, String msg){this.code = resultCode;this.text = msg;}public Result(int resultCode){this.code = resultCode;}public int getCode(){return code;}public void setCode(int code){this.code = code;}public String getText(){return text;}public void setText(String text){this.text = text;}}

7.不足和待完善的地方:

(1)返回的数据解析:

从官方api来看,返回的数据json格式分为许多种类,我们应该针对各个种类来分别解析,并且很友好的在界面显示出来。而我们只是把json的code和text解析出来了,后面的其它数据,是没有解析的。当然了, 这个数据解析不是怎么特别难,参考样例,我们分类解析就OK了。

(2)解析完数据,我们应该采用什么方式来管理返回的数据,解析返回的数据,并把这些数据显示在界面中呢?当然,有一个笨的方法,就是采用一个一个针对功能的方法来实现,但是,编程经验告诉我们,我们应该采用针对接口的方法来实现这一部分。我可能采用的方案是观察者模式来管理,过滤和实时显示数据,这部分,有时间再来做吧。

8.源码下载地址:

http://download.csdn.net/download/hfreeman2008/8211255

9.参考资料:

(1)Android 智能问答机器人的实现

http://blog.csdn.net/lmj623565791/article/details/38498353

(2)图灵机器人平台接入

http://www.tuling123.com/openapi/cloud/access_api.jsp

(3)Android 网络操作常用的两个类

http://tech.ddvip.com/2013-08/1375807684200390.html

Android图灵机器人的实现(一)相关推荐

  1. android图灵机器人教程,简单的调用图灵机器人

    publicTuLingTest() { InitializeComponent(); }private ActionShowMsg;private void TuLingTest_Load(obje ...

  2. Android图灵聊天机器人-薇尔莉特

    智能聊天机器人-图灵机器人项目说明 文章目录 智能聊天机器人-图灵机器人项目说明 1.项目介绍 2.项目用到的技术 3.项目的开发环境 4.开发步骤 1.首先编写主界面(activity_main.x ...

  3. 图灵机器人-Java/Android

    概述: 一直觉得图灵机器人这个小东西是一个很好玩的东西,今天去官网看了一下,里面一段Java代码的调用试例,而且是以main方法封装好了的,我想是不是可以直接拿来用.一点戏剧性都没有,除了自己impo ...

  4. 调用图灵机器人API实现简单聊天

    昨天突然想在Android下调用图灵机器人API实现聊天的功能.说干就干,虽然过程中遇见一些问题,但最后解决了的心情真好. API接口是(key值可以在图灵机器人网站里注册得到) www.tuling ...

  5. Android聊天机器人

    一.项目介绍 ​ 本项目使用android来开发一个智能聊天机器人,该智能聊天机器人主要是供用户娱乐,他可以供用户娱乐休闲,他可以与用户讲故事.说笑话.说笑话.跟用户聊天,非常有趣. 涉及到知识点: ...

  6. 智能聊天机器人之图灵机器人

    今天从慕课网学习了图灵机器人的实现,感觉很有意思.视频地址:点击打开链接,因为视频是一年多以前的,现在图灵官网的api接口已经变了,所以视频仅作参考,本文是基于最新api讲解的. 无聊的时候可以找它陪 ...

  7. 图灵机器人快速接入教程

    图灵机器人快速接入Android APP教程 修改日期:160806, 急用的直接下项目TulingDemo 准备: 0.创建安卓或ios项目,让开发工具先编译环境,利用这段时间打开浏览器完成注册什么 ...

  8. 图灵机器人SDK接入指南

    图灵机器人SDK接入指南 图灵机器人:官网 注册账号 注册个账号,创建个应用,进入后台,点开机器人接入,你会看到API key和secret 下载SDK 点击下载Android SDK,解压以后会有l ...

  9. 手把手教你做Android聊天机器人

    我相信大家应该知道有款应用叫小黄鸡吧! 如果不知道,那你见过那种可以秒回复的聊天应用么? 如果仍然没看到!那你总见过可以迅速回复你的微信公共账吧! 如果仍然....亲出门左拐 好,不多说. 首先大家都 ...

最新文章

  1. mysql sae_新浪SAE的mysql与百度SAE的代码区别?
  2. centos打显卡驱动命令_CentOS7显卡驱动问题
  3. python网络编程—UDP的echo服务
  4. UCOSIII移植问题说明
  5. 使用 Git Extensions 简单入门 Git
  6. 大工13秋《计算机文化基础》在线测试1,大工13秋《计算机文化基础》辅导资料六...
  7. IOT(32)---各大物联网平台对比
  8. Linux 网络配置 修改DNS配置文件/etc/resolv.conf后,重启网络,DNS配置丢失
  9. Sqoop架构(四)
  10. 软件精选中的Windows软件安装目录,含软件包和安装教程
  11. 微信怎么at所有人_[微信艾特所有人怎么弄]微信怎么艾特所有人
  12. photoshop教程裁剪和拉直照片以改善构图
  13. 为什么编辑器打开PDF文档后提示缺少字体
  14. 模拟电子中放大电路的基本分析方法
  15. TortoiseSVN配置
  16. 小学计算机绘图体会,辅导小学生电脑绘画的几点做法
  17. 安了锐捷后电脑总是弹出交互式检测
  18. 【HISI系列】之HISI芯片码率控制使用说明
  19. 一篇文章教会你将nfc运用到极致
  20. 互联网开发岗实习及秋招总结

热门文章

  1. linux 之top命令详解
  2. 动手学深度学习笔记3.4+3.5+3.6+3.7
  3. 高性能高可用MySQL(主从同步,读写分离,分库分表,去中心化,虚拟IP,心跳机制)
  4. 光纤布线系统的设计与检测(一)
  5. 扔掉U盘:两步教你如何使用硬盘装系统(适用gpt磁盘)
  6. windows找不到gpedit.msc请确定文件名
  7. 2021-09-10 网安实验-XCTF真题实战之密码学
  8. python将图片拼接为视频
  9. 计算机四级怎么算通过,计算机四级是如何规定的,怎样算合格?
  10. 客户端登录阿里云mysql数据库_Mysql数据库之数据库术语和客户端登陆