利用茉莉机器人接口开发一个简单的安卓机器人app
一、前言
茉莉机器人与其他机器人相比,主要的优势就是免费,不足之处就是不够智能,很多问题都回答不出来。不过呢,茉莉机器人允许用户自定义问题和问题对应的回答,对个人而言还是挺有用的,你可以利用这一点,记录自己容易忘记的一些事情。当然,不建议你把重要的信息,例如账户密码放上去。下图是注册登录账号之后的个人中心,你也可以去官网自己注册一个。
二、APP界面
应用比较简单,只有一个界面,如下图。
可以看到,你想让它怎么回答就怎么回答。大家自行去官网注册,把Api Key和Api Secret换成你们自己的即可。
三、代码
程序的所有接口、类如下图所示。
HttpCallbackListener和HttpUtil是用来进行网络请求操作的。
MainActivity是主界面对应的活动。
Msg是消息的实体类。
MsgAdapter是RecyclerView的适配器。
- HttpCallbackListener
public interface HttpCallbackListener
{void onFinish(String response);void onError(Exception e);
}
- HttpUtil
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpUtil
{public static void sendHttpRequest(final String address, final HttpCallbackListener listener){new Thread(new Runnable(){@Overridepublic void run(){HttpURLConnection connection = null;try{URL url = new URL(address);connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(8000);connection.setReadTimeout(8000);connection.setDoInput(true);connection.setDoOutput(true);InputStream in = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null){response.append(line);}if (listener != null){// 回调 onFinish()方法listener.onFinish(response.toString());}} catch (Exception e){if (listener != null){// 回调 onError()方法listener.onError(e);}} finally{if (connection != null){connection.disconnect();}}}}).start();}}
- MainActivity
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;public class MainActivity extends AppCompatActivity
{private EditText et;private Button btn;private RecyclerView rv;private List<Msg> msgList = new ArrayList<>();private MsgAdapter adapter;private String [] arr={"近来可好,我亲爱的主人!","欢迎主人的归来!","很高兴又见到了我的主人!","主人您好,请问有什么可以帮您的吗?","我是一个能跟用户智能交互的“人”,可以帮用户查询一些实用的资料,比如天气预报、LoL战绩、IP地址等,还拥有一些娱乐系统,比如笑话和抽签等。"};private long curTime=0,oldTime=0;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et=findViewById(R.id.et);btn=findViewById(R.id.btn);rv=findViewById(R.id.rv);LinearLayoutManager layoutManager = new LinearLayoutManager(this);rv.setLayoutManager(layoutManager);adapter = new MsgAdapter(msgList);rv.setAdapter(adapter);initMsgs();btn.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){String content = et.getText().toString();if(!content.equals("")){Msg msg = new Msg();msg.setContent(content);msg.setType(Msg.TYPE_SEND);SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = simpleDateFormat.format(new Date());msg.setTime(format);msgList.add(msg);adapter.notifyItemInserted(msgList.size() - 1); // 当有新消息时,刷新 RecyclerView 中的显示rv.scrollToPosition(msgList.size()-1); 将RecyclerView 定位到最后一行et.setText("");InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(et.getWindowToken(), 0);HttpUtil.sendHttpRequest("http://i.itpk.cn/api.php?api_key=fe6ed258c8faf18e6400bd7a9d401f16&api_secret=jwxa3c845wxb&question=" + content, new HttpCallbackListener(){@Overridepublic void onFinish(String response){Msg msg = new Msg();msg.setContent(response);msg.setType(Msg.TYPE_RECEIVE);SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = simpleDateFormat.format(new Date());msg.setTime(format);msgList.add(msg);adapter.notifyItemInserted(msgList.size() - 1); // 当有新消息时,刷新 RecyclerView 中的显示rv.scrollToPosition(msgList.size()-1); 将RecyclerView 定位到最后一行}@Overridepublic void onError(Exception e){}});}}});}private void initMsgs(){Random random=new Random();int i = random.nextInt(arr.length);Msg msg1 = new Msg();msg1.setType(Msg.TYPE_RECEIVE);msg1.setContent(arr[i]);SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String format = simpleDateFormat.format(new Date());msg1.setTime(format);msgList.add(msg1);}}
- Msg
public class Msg
{public static final int TYPE_RECEIVE=0;public static final int TYPE_SEND=1;private String content;private int type;private String time;public String getContent(){return content;}public void setContent(String content){this.content = content;}public int getType(){return type;}public void setType(int type){this.type = type;}public String getTime(){return time;}public void setTime(String time){this.time = time;}
}
- MsgAdapter
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder>
{private static long curTime=0,oldTime=0;private List<Msg> mMsgList;static class ViewHolder extends RecyclerView.ViewHolder{LinearLayout leftLayout;LinearLayout rightLayout;TextView leftMsg;TextView rightMsg;TextView timeTv1;TextView timeTv2;public ViewHolder(View view){super(view);leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);leftMsg = (TextView) view.findViewById(R.id.left_msg);rightMsg = (TextView) view.findViewById(R.id.right_msg);timeTv1=(TextView)view.findViewById(R.id.timeTv1);timeTv2=(TextView)view.findViewById(R.id.timeTv2);}}public MsgAdapter(List<Msg> msgList){mMsgList = msgList;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position){Msg msg = mMsgList.get(position);if (msg.getType() == Msg.TYPE_RECEIVE){// 如果是收到的消息,则显示左边的消息布局,将右边的消息布局隐藏holder.leftLayout.setVisibility(View.VISIBLE);holder.rightLayout.setVisibility(View.GONE);holder.leftMsg.setText(msg.getContent());holder.timeTv1.setText(msg.getTime());} else if(msg.getType() == Msg.TYPE_SEND){// 如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏holder.rightLayout.setVisibility(View.VISIBLE);holder.leftLayout.setVisibility(View.GONE);holder.rightMsg.setText(msg.getContent());holder.timeTv2.setText(msg.getTime());}}@Overridepublic int getItemCount(){return mMsgList.size();}}
四、项目的地址
github地址
利用茉莉机器人接口开发一个简单的安卓机器人app相关推荐
- 如何利用spring框架来开发一个简单的小项目——书店项目
这里我将用spring来开发一个简单的书店项目 Step1:所用到的开发软件为 idea , 所用到的jar包为 这些jar的下载可在 官网 下载,选择5.2.6版本下载,不会的在下面评论私信 Ste ...
- 【如何快速的开发一个简单的iOS直播app】(代码篇)
开篇([如何快速的开发一个完整的iOS直播app](原理篇) ) 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金 ...
- 用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....
共回答了18个问题采纳率:94.4% #include #include void add(float num1,float num2) { printf("num1 + num2 = %6 ...
- 利用WCF的callback机制开发一个简单的多人游戏模型
本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...
- python可以做机器人吗_零基础如何用Python写一个简单的WeChat机器人?(内附代码)...
(bing图片) python这两年热火朝天,依托其众多类库,基于python的应用层出不穷,也大大降低了非计算机专业人员的入门门槛,WeChat机器人自然不在话下!-- 聪明的瓦肯人 苦于有时候总是 ...
- django之十一--开发一个简单的醉得意菜单和人均支付金额查询页面
一.前言 针对搭伙吃饭的点菜,我们时常会从人数和人均金额去考虑一家餐厅的菜单,所以点菜对于大锅饭的伙伴也成了一门学问和难题,本篇文章巧妙的应用代码思想,将实际问题转化为代码问题,例如如下是一个醉得意的 ...
- 机器人坐标系建立_如何在30分钟内建立一个简单的搜索机器人
机器人坐标系建立 by Quinn Langille 奎因·兰吉尔(Quinn Langille) 如何在30分钟内建立一个简单的搜索机器人 (How to Build A Simple Search ...
- 开发一个简单易用的SDK的详细步骤(超详细,超适用)
文章目录 开发一个简单易用的SDK的详细步骤 创建starter步骤 关键点 总结 开发一个简单易用的SDK的详细步骤 创建starter步骤 1.新建一个 spring boot 初始化项目 2.添 ...
最新文章
- php impload 展开,PHP implode()函数用法讲解
- 【转】Linux Netfilter实现机制和扩展技术
- Jmeter之断言操作
- 前美团产品专家罗鑫:谈谈我对增长这件事的理解
- SpringMVC-RestfulCRUD
- k8s pod资源限制策略:requests、limits配置示例
- dns的服务器地址是多少当前位置,dns的服务器地址设置为多少
- mysql主从修改系统参数步骤_mysql主从配置的参数配置与步骤_MySQL
- electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信
- 谷歌浏览器插件入门示例
- linux急救模式_抢救Linux:我如何将组织介绍给Linux
- windows2003路由和远程访问 试图连接到数据存储时出错
- Exchange 混合部署—Office 365 注册及预览
- 如何得到DataTable的列名
- 攀枝花学院计算机专业单身率,重磅 | 攀枝花学院2018届毕业生就业质量年度报告...
- 激光雷达+imu_激光雷达——定位
- c++对象模型探索-王健伟-专题视频课程
- 计算机中 加减运算 的 实现原理
- 重磅!京东云自研第四代云主机发布;曝国外物理学家开发出用于量子计算机的汇编语言...
- 二手平台android界面,Android二手书交易app设计(2)启动图Activity