安卓模仿QQ聊天界面及調用圖靈機器人API

代碼地址

Github地址:https://github.com/jh360twb/Tuling

積分下載地址https://download.csdn.net/download/qq873044564/11834499

網盤下載地址:

鏈接:https://pan.baidu.com/s/1QbbjRn1ET9CnvVyQEahSyQ 
提取碼:8d0r 
 

最新更新最近國慶節,更新了一波UI,採用了這種更加實用的聊天界面,回覆的內容是調用的是免費藉口回覆過來的.

運行截圖:


先去圖靈機器人官網中申請一個機器人,然後在個人中心找到自己的apikey和userid(就是你頭像右邊的數字)

依賴:

    implementation 'com.squareup.okhttp3:okhttp:3.4.1'

然後找到他們的文檔中的接入教程,到時候解析JSON的時候就會按照這個來解析

{
	"reqType":0,
    "perception": {
        "inputText": {
            "text": "附近的酒店"
        },
        "inputImage": {
            "url": "imageUrl"
        },
        "selfInfo": {
            "location": {
                "city": "北京",
                "province": "北京",
                "street": "信息路"
            }
        }
    },
    "userInfo": {
        "apiKey": "",
        "userId": ""
    }
}

具體代碼我就不貼了,在這裏只貼一些比較關鍵的代碼:

1.recycler的初始化以及自動滾動

private void InitRecyclerView() {
        msg_recyclerview = findViewById(R.id.msg_recyclerview);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        msg_recyclerview.setLayoutManager(linearLayoutManager);
        msgAdapter = new MsgAdapter(msgs, context);
        msg_recyclerview.setAdapter(msgAdapter);
        //鍵盤上移時recyclerview跟着上移
        msgs.clear();
        msg1 = new Msg("你好,請問想和我聊什麼呢?",Msg.TYPE_RECEIVED);
        msgs.add(msg1);
        msg_recyclerview.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (bottom < oldBottom) {
                    msg_recyclerview.post(new Runnable() {
                        @Override
                        public void run() {
                            if (msgAdapter.getItemCount() > 0) {
                                msg_recyclerview.smoothScrollToPosition(msgAdapter.getItemCount() - 1);
                            }
                        }
                    });
                }
            }
        });
    }

點擊發送後,把對話框中的內容發送出去

case R.id.send:
                if (want_to_say.getText().toString().equals("")) {
                    //
                    Toast.makeText(context, "請輸入內容", Toast.LENGTH_SHORT).show();
                } else {
                    Log.e("MainActivity-----",want_to_say.getText().toString());
                    msg = new Msg(want_to_say.getText().toString(), Msg.TYPE_SENT);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                msgs.add(msg);
                                Log.e("MainActivity-----",msg.getContent());
                                msgAdapter.notifyItemInserted(msgs.size() - 1);
                                msg_recyclerview.scrollToPosition(msgs.size() - 1);
                                internet();
                                want_to_say.setText("");
                            }
                        });
                    }

                }).start();
                }
                break;

關於接口的代碼:

private void internet() {
        new Thread(new Runnable() {
            @Override
            public void run() {
 //Post是收回來的JSON數據
                final String content1 = Post();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
//提取JSON數據中的content
                            msg1 = new Msg(handleJson(content1), Msg.TYPE_RECEIVED);
                            msgs.add(msg1);
                            msgAdapter.notifyItemInserted(msgs.size() - 1);
                            msg_recyclerview.scrollToPosition(msgs.size() - 1);
                            //Glide.get(context).clearMemory();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

            }
        }).start();
    }

    private String Post() {
                OkHttpClient okHttpClient = new OkHttpClient();//客戶端
                RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), getJson(msg.getContent()));
                Request request = new Request.Builder()//發送請求
                        .url(GET_URL)
                        .post(requestBody)//把body發送出去
                        .build();
                try {
                    Response response = okHttpClient.newCall(request).execute();//接受傳回來的
                    String content = response.body().string();
                    Log.e("TAG-------", content);
                    return content;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;

    }

    public static String handleJson(String json) throws JSONException {
        StringBuilder stringBuilder = new StringBuilder();
        JSONObject jsonObject = new JSONObject(json);
        JSONArray jsonArray = jsonObject.getJSONArray("results");
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject object = jsonArray.getJSONObject(i);
            String content = object.getJSONObject("values").getString("text");
            stringBuilder.append(content);
        }
        return String.valueOf(stringBuilder);
    }

    public static String getJson(String content) {

       return "{\n"+
            "\"reqType\":0,\n"+
               "\"perception\": {\n"+
            "\"inputText\": {"+
            "   \"text\":\" "+content+"\"\n" +
            "},\n"+
            "},\n"+
            "\"userInfo\": {"+
            "\"apiKey\": \"fff5b072570540e892a208abb5d8250a\",\n"+
               "\"userId\": \"297227\"\n"+
        "   }\n"+
        "}";
    }

 

還有Adapter中的代碼

package com.example.tuling;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.example.tuling.Bean.Msg;

import java.util.ArrayList;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
    List<Msg> msgList = new ArrayList<>();
    Context context;
    LayoutInflater inflater;

    public MsgAdapter(List<Msg> list,Context context){
        this.msgList = list;
        this.context = context;
        inflater = LayoutInflater.from(context);
    }
    @Override
    public MsgAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view =inflater.inflate(R.layout.msg_item,null);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MsgAdapter.ViewHolder viewHolder, int i) {
        Msg msg = msgList.get(i);
        if (msg.getType() == Msg.TYPE_RECEIVED){
            viewHolder.left.setVisibility(View.VISIBLE);
            viewHolder.right.setVisibility(View.GONE);
            viewHolder.imageView_right.setVisibility(View.GONE);
            viewHolder.imageView_left.setVisibility(View.VISIBLE);
            viewHolder.left_msg.setText(msg.getContent());
        }else{
            viewHolder.left.setVisibility(View.GONE);
            viewHolder.right.setVisibility(View.VISIBLE);
            viewHolder.imageView_left.setVisibility(View.GONE);
            viewHolder.imageView_right.setVisibility(View.VISIBLE);
            viewHolder.right_msg.setText(msg.getContent());
        }

    }

    @Override
    public int getItemCount() {
        return msgList.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        RelativeLayout left;
        RelativeLayout right;
        CircleImageView imageView_left;
        CircleImageView imageView_right;
        TextView left_msg;
        TextView right_msg;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView_left = itemView.findViewById(R.id.image_left);
            imageView_right = itemView.findViewById(R.id.right_image);
            Glide.with(context).load(R.drawable.seretary).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).error(R.drawable.seretary).into(imageView_left);
            Glide.with(context).load(R.drawable.me).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).error(R.drawable.me).into(imageView_right);
            left = itemView.findViewById(R.id.left_layout);
            right = itemView.findViewById(R.id.right_layout);
            left_msg = itemView.findViewById(R.id.left_mag);
            right_msg = itemView.findViewById(R.id.right_msg);
        }
    }
}

 

 

 

 

 

順便說一波安卓9.0申請網絡權限新要求

如果你的運行手機安卓系統是9.0,網絡權限需要多加一個xml文件,在res中新建一個network_security_config.xml,寫入:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>

然後在manifests中加上

android:networkSecurityConfig="@xml/network_security_config"

就OK了

 

 

 

 

 

 

 

 

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