一、前言
茉莉機器人與其他機器人相比,主要的優勢就是免費,不足之處就是不夠智能,很多問題都回答不出來。不過呢,茉莉機器人允許用戶自定義問題和問題對應的回答,對個人而言還是挺有用的,你可以利用這一點,記錄自己容易忘記的一些事情。當然,不建議你把重要的信息,例如賬戶密碼放上去。下圖是註冊登錄賬號之後的個人中心,你也可以去官網自己註冊一個。
二、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()
{
@Override
public 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;
@Override
protected 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()
{
@Override
public 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()
{
@Override
public 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 定位到最後一行
}
@Override
public 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;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false);
return new ViewHolder(view);
}
@Override
public 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());
}
}
@Override
public int getItemCount()
{
return mMsgList.size();
}
}