文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

kotlin实现语音聊天机器人案例详解

2023-02-16 12:02

关注

此篇文章紧做关于语音机器人聊天开发,后续功能实现请关注后续文章!!!

此篇文章完成后效果展示:

一.机器人聊天—对话adapter的实现

1.准备两张左右两边动画背景图片,做left,和right两边布局,为Recyclerview的实现做准备。

left_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:src="@drawable/assistant"/>
    <TextView
        android:id="@+id/tv_left_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:background="@drawable/chat_bg_cloud"
        android:gravity="center_vertical"
        android:padding="20dp"
        android:textColor="@android:color/white"/>
</LinearLayout>

right_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="right|center_vertical"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tv_right_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:background="@drawable/chat_bg_user"
        android:gravity="center_vertical"
        android:padding="20sp"
        android:textColor="@android:color/white"/>
    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/user"/>
</LinearLayout>

2.在entity包下ChatListData对话列表的实体类,代码如下:

package com.zrc.smartbutler.entity

class ChatListData(var type:Int,var context:String){
    companion object{
        const val TyPE_RECEIVED = 0
        const val Type_SENT = 1
    }
}

3.在adapter包下创建ChatListAdapter对话Adapter,代码如下:

package com.zrc.smartbutler.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.zrc.smartbutler.R
import com.zrc.smartbutler.entity.ChatListData

class ChatListAdapter (val mList:List<ChatListData>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    inner class LeftViewHolder(view:View):RecyclerView.ViewHolder(view){
        val leftMsg:TextView = view.findViewById(R.id.tv_left_text)
    }
    inner class RightViewHolder(view:View):RecyclerView.ViewHolder(view){
        val rightMsg:TextView = view.findViewById(R.id.tv_right_text)
    }
    override fun getItemViewType(position: Int): Int {
        val msg = mList[position]
        return msg.type
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = if(viewType==ChatListData.TyPE_RECEIVED){
        val view = LayoutInflater.from(parent.context).inflate(R.layout.left_item,parent,false)
        LeftViewHolder(view)
    }else{
        val view = LayoutInflater.from(parent.context).inflate(R.layout.right_item,parent,false)
        RightViewHolder(view)
    }
    override fun getItemCount() = mList.size
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val msg = mList[position]
        when(holder){
            is LeftViewHolder -> holder.leftMsg.text = msg.context
            is RightViewHolder -> holder.rightMsg.text = msg.context
            else -> throw IllegalArgumentException()
        }
    }
}

这段代码,仿写自郭霖大神的第一行代码(第三版),详情解析,请查看第三行代码!

至此,对话adapter完成!!!

二.机器人聊天—机器人实时对话实现

1.导入RecyclerView依赖

implementation 'androidx.recyclerview:recyclerview:1.1.0

2.前往fragment_butler.xml,编写界面交互代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/wechat_bg"
    android:orientation="vertical">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/inputText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="输入"
            android:maxLines="2"/>
        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:background="@drawable/button_bg"
            android:text="发送"/>
    </LinearLayout>
</LinearLayout>

3.编写Kotlin交互代码:

package com.zrc.smartbutler.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.kymjs.rxvolley.RxVolley
import com.kymjs.rxvolley.client.HttpCallback
import com.zrc.smartbutler.R
import com.zrc.smartbutler.adapter.ChatListAdapter
import com.zrc.smartbutler.entity.ChatListData
import com.zrc.smartbutler.utils.StaticClass
import kotlinx.android.synthetic.main.fragment_butler.view.*
import org.json.JSONException
import org.json.JSONObject

class ButlerFragment:Fragment() {
    private val msgList = ArrayList<ChatListData>()
    private var adapter:ChatListAdapter?= null
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view:View = inflater.inflate(R.layout.fragment_butler,null)
        findView()
        val layoutManager = LinearLayoutManager(this.context)
        view.recyclerView.layoutManager = layoutManager
        adapter = ChatListAdapter(msgList)
        view.recyclerView.adapter = adapter
        view.send.setOnClickListener {
            
            //1.获取输入框的内容
            val content = view.inputText.text.toString()
            //2.判断是否为空
            if(content.isNotEmpty()){
                //3.判断长度不能大于30
                if(content.length>30){
                    Toast.makeText(activity,"输入长度超出限制",Toast.LENGTH_SHORT).show()
                }else{
                    //4.添加你输入的内容到right item
                    val msg = ChatListData(ChatListData.Type_SENT,content)
                    msgList.add(msg)
                    adapter?.notifyItemInserted(msgList.size-1)//当有新消息时,刷新RecycleView中的显示
                    view.recyclerView.scrollToPosition(msgList.size-1)//讲RecycleView定位到最后一行
                    //5.清空当前的输入框
                    view.inputText.setText("")
                    //6.发送给机器人请求返回内容
                    //6.发送给机器人请求返回内容
                    val url = ("http://op.juhe.cn/robot/index?info=" + content + "&key=" + StaticClass().CHAT_LIST_KEY)
                    RxVolley.get(url,object :HttpCallback(){
                        override fun onSuccess(t: String?) {
                            //Toast.makeText(activity,t,Toast.LENGTH_SHORT).show()
                            parsingJson(t!!,view)
                        }
                    })
                }

            }else{
                Toast.makeText(activity,"输入框不能为空",Toast.LENGTH_SHORT).show()
            }
        }
        return view
    }
    private fun findView() {
        val msg1 = ChatListData(ChatListData.TyPE_RECEIVED,"你好,我是大雨子!!!")
        msgList.add(msg1)
    }
    //解析Json
    private fun parsingJson(t: String,view: View) {
        try {
            val jsonObhect = JSONObject(t)
            val jsonresult = jsonObhect.getJSONObject("result")
            //拿到返回值
            val text = jsonresult.getString("text")
            //7.拿到机器人的返回值之后添加在left item
            val msg = ChatListData(ChatListData.TyPE_RECEIVED,text)
            msgList.add(msg)
            adapter?.notifyItemInserted(msgList.size-1)//当有新消息时,刷新RecycleView中的显示
            view.recyclerView.scrollToPosition(msgList.size-1)//讲RecycleView定位到最后一行
        } catch (e: JSONException) {
            e.printStackTrace()
        }
    }
}

代码逻辑上面注释已经写清楚了,就不多赘述!!!

至此,机器人的对话实现!!!

到此这篇关于kotlin实现语音聊天机器人案例详解的文章就介绍到这了,更多相关kotlin聊天机器人内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯