安卓调用图灵机器人API实现模拟聊天

代码地址

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

积分下载地址https://download.csdn.net/download/qq873044564/11834499
 

最新更新最近国庆节,更新了一波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了

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值