利用茉莉機器人接口開發一個簡單的安卓機器人app

一、前言

茉莉機器人與其他機器人相比,主要的優勢就是免費,不足之處就是不夠智能,很多問題都回答不出來。不過呢,茉莉機器人允許用戶自定義問題和問題對應的回答,對個人而言還是挺有用的,你可以利用這一點,記錄自己容易忘記的一些事情。當然,不建議你把重要的信息,例如賬戶密碼放上去。下圖是註冊登錄賬號之後的個人中心,你也可以去官網自己註冊一個。
在這裏插入圖片描述

二、APP界面

應用比較簡單,只有一個界面,如下圖。
在這裏插入圖片描述
可以看到,你想讓它怎麼回答就怎麼回答。大家自行去官網註冊,把Api Key和Api Secret換成你們自己的即可。

三、代碼

程序的所有接口、類如下圖所示。
在這裏插入圖片描述
HttpCallbackListener和HttpUtil是用來進行網絡請求操作的。
MainActivity是主界面對應的活動。
Msg是消息的實體類。
MsgAdapter是RecyclerView的適配器。

  1. HttpCallbackListener
public interface HttpCallbackListener
{
    void onFinish(String response);
    void onError(Exception e);
}
  1. 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();
    }

}
  1. 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);

    }

}

  1. 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;
    }
}
  1. 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();
    }

}

四、項目的地址

github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章