代码地址
Github地址:https://github.com/jh360twb/Tuling
积分下载地址https://download.csdn.net/download/qq873044564/11834499
网盘下载地址:
链接:https://pan.baidu.com/s/1QbbjRn1ET9CnvVyQEahSyQ
提取码:8d0r
最新更新最近国庆节,更新了一波UI,采用了这种更加实用的聊天界面,回复的内容是调用的是免费借口回复过来的.
运行截图:
先去图灵机器人官网中申请一个机器人,然后在个人中心找到自己的apikey和userid(就是你头像右边的数字)
然后找到他们的文档中的接入教程,到时候解析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了