Android中导入讯飞大模型ai智能系统

1.在讯飞大平台申请免费接口(申请后获取url和token)

2.创建一个数据库进行储存对话聊天记录

package com.example.myapplication.XL;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.myapplication.Bean.MessageBean;

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

/**
 * ai聊天对话 数据库
 */

public class MessageDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "chat.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_MESSAGES = "messages";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_CONTENT = "content";
    private static final String COLUMN_IS_USER = "is_user";

    public MessageDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_MESSAGES + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_CONTENT + " TEXT, " +
                COLUMN_IS_USER + " INTEGER)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_MESSAGES);
        onCreate(db);
    }

    // 插入消息
    public void insertMessage(String content, boolean isUser) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(COLUMN_CONTENT, content);
        values.put(COLUMN_IS_USER, isUser ? 1 : 0);
        db.insert(TABLE_MESSAGES, null, values);
        db.close();
    }

    public List<MessageBean> getAllMessages() {
        List<MessageBean> messages = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = null;

        try {
            cursor = db.query(TABLE_MESSAGES, null, null, null, null, null, null);

            if (cursor != null) {
                while (cursor.moveToNext()) {
                    int contentIndex = cursor.getColumnIndex(COLUMN_CONTENT);
                    int isUserIndex = cursor.getColumnIndex(COLUMN_IS_USER);

                    if (contentIndex != -1 && isUserIndex != -1) {
                        String content = cursor.getString(contentIndex);
                        boolean isUser = cursor.getInt(isUserIndex) == 1;
                        messages.add(new MessageBean(content, isUser));
                    }
                }
            }
        } catch (Exception e) {
            Log.e("DatabaseError", "Error reading from database", e);
        } finally {
            if (cursor != null) {
                cursor.close();
            }
            db.close();
        }
        return messages;
    }

}

3.使用recycleview展示出人机对话聊天(输入框\按钮等)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#EFEDED">

    <RelativeLayout
        android:id="@+id/r1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="20dp">
        <ImageView
            android:id="@+id/back"
            android:layout_width="18dp"
            android:layout_height="18dp"
            android:src="@drawable/back" />

        <TextView
            android:id="@+id/titleTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="智链智能"
            android:textColor="#000" />
    </RelativeLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/inputLayout"
        android:layout_below="@id/r1"
        android:layout_marginBottom="30dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />


    <TextView
        android:id="@+id/t1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/inputLayout"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:text="正在加载中...."
        android:visibility="gone"/>


    <LinearLayout
        android:id="@+id/inputLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:background="#FFF"
        android:padding="10dp">

        <EditText
            android:id="@+id/editTextMessage"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@drawable/yuan"
            android:backgroundTint="#EFEDED"
            android:layout_weight="1"
            android:hint="请输入内容"
            android:paddingLeft="10dp"
            android:textSize="13sp"
            android:padding="10dp"/>

        <Button
            android:id="@+id/buttonSend"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/yuan"
            android:backgroundTint="#DC6464"
            android:layout_marginLeft="20dp"
            android:text="发送"/>
    </LinearLayout>

</RelativeLayout>

4.编写xml对应的java文件

package com.example.myapplication.XL;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.myapplication.Adapter.MessageAdapter;
import com.example.myapplication.Bean.MessageBean;
import com.example.myapplication.R;
import com.google.gson.Gson;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

// LianXiKeFuActivity: 用于实现与 AI 聊天的活动
public class LianXiKeFuActivity extends AppCompatActivity {

    // UI 组件
    private ImageView backButton;
    private RecyclerView messageRecyclerView;
    private MessageAdapter messageAdapter;
    private List<MessageBean> messageList;
    private EditText messageInputField;
    private MessageDatabaseHelper messageDatabaseHelper;
    private TextView loadingIndicator;
    private Button sendButton;

    // 申请 讯飞开放平台API 请求的 URL 和 认证令牌
    private static final String API_URL = "https://spark-api-open.xf-yun.com/v1/chat/completions";
    private static final String AUTH_TOKEN = "Bearer AxYXpMyqsxTUzJtMHdS:NbbTQZhZWAZUafwGgfl";    //这是我自己的token,不可以直接使用,请自己申请


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lian_xi_ke_fu);

        // 初始化 UI 组件
        initializeUIComponents();

        // 设置返回按钮的点击事件
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish(); // 关闭当前活动
            }
        });
        // 设置 RecyclerView
        messageList = new ArrayList<>();
        messageAdapter = new MessageAdapter(messageList);
        messageRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        messageRecyclerView.setAdapter(messageAdapter);

        //每次进入时 启动数据库 并且放入recycleview
        //TODO 初始化数据库助手并加载消息
        messageDatabaseHelper = new MessageDatabaseHelper(this);
        loadMessages(); // 从数据库加载消息


        // 设置发送按钮的点击事件
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userMessage = messageInputField.getText().toString().trim();
                if (!userMessage.isEmpty()) {
                    // 添加用户消息到列表
                    messageList.add(new MessageBean(userMessage, true));
                    messageAdapter.notifyItemInserted(messageList.size() - 1);
                    messageRecyclerView.scrollToPosition(messageList.size() - 1);
                    messageInputField.setText(""); // 清空输入框
                    // 将用户消息插入数据库
                    messageDatabaseHelper.insertMessage(userMessage, true);
                    // 发送聊天请求
                    sendChatRequest(userMessage);
                }
            }
        });

        sendGreetingMessage();


    }

    //TODO 从数据库加载消息  调用方法
    private void loadMessages() {
        List<MessageBean> messages = messageDatabaseHelper.getAllMessages();
        messageList.clear(); // 清空消息列表
        messageList.addAll(messages); // 添加从数据库加载的消息
        messageAdapter.notifyDataSetChanged(); // 更新适配器

        // 滚动到最新消息
        if (!messageList.isEmpty()) {
            messageRecyclerView.scrollToPosition(messageList.size() - 1);
        }
    }


    // 初始化 UI 组件
    private void initializeUIComponents() {
        backButton = findViewById(R.id.back);
        messageRecyclerView = findViewById(R.id.recyclerView);
        loadingIndicator = findViewById(R.id.t1);
        messageInputField = findViewById(R.id.editTextMessage);
        sendButton = findViewById(R.id.buttonSend);
    }

    // 发送问候语
    private void sendGreetingMessage() {
        String greeting = "您好,请问有什么可以帮到您!";
        messageList.add(new MessageBean(greeting, false));
        messageAdapter.notifyItemInserted(messageList.size() - 1);
        messageRecyclerView.scrollToPosition(messageList.size() - 1);
    }

    //TODO 发送聊天请求
    private void sendChatRequest(String userInput) {

        OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例
        // 构建请求参数   步骤1
        Map<String, Object> requestParams = new HashMap<>();
        requestParams.put("max_tokens", 4096);
        requestParams.put("top_k", 4);
        requestParams.put("temperature", 0.5);
        requestParams.put("model", "4.0Ultra");
        requestParams.put("stream", true);

        Log.e("Map",requestParams.toString());

        // 构建list 请求参数
        List<Map<String, String>> messages = new ArrayList<>();
        Map<String, String> systemMessage = new HashMap<>();
        systemMessage.put("role", "system");
        systemMessage.put("content","你是一位智链校园app的客服,目标任务:解决用户发送的内容,但是只能回复与该APP有关的话题,当询问与app不相关的问题时,则默认回复,不好意思,我无法回答您的问题如果您有关于智链校园app使用的疑问或帮助,请随时告诉我!,");    //TODO  这是给ai设置了固定角色要求,,如果没有要求则删除

        messages.add(systemMessage);     


        //用户发送消息 存储到map列表
        Map<String, String> userMessage = new HashMap<>();
        userMessage.put("role", "user");
        userMessage.put("content", userInput);
        messages.add(userMessage);
        requestParams.put("messages", messages);
        Log.e("map",requestParams.toString());
        // 将请求参数转换为 JSON  步骤2
        Gson gson = new Gson();
        String jsonRequestBody = gson.toJson(requestParams);

        Log.e("jsonRequestBody",jsonRequestBody);
        // 创建请求体
        RequestBody requestBody = RequestBody.create(jsonRequestBody,MediaType.parse("application/json; charset=utf-8"));

        // 创建请求
        Request request = new Request.Builder()
                .url(API_URL)
                .addHeader("Authorization", AUTH_TOKEN) // 添加认证头
                .post(requestBody) // POST 请求
                .build();

        loadingIndicator.setVisibility(View.VISIBLE); // 显示加载指示器
        sendButton.setEnabled(false); // 禁用发送按钮


        // 发送请求   步骤3
        client.newCall(request).enqueue(new Callback() {
            public void onFailure(Call call, IOException e) {
                Log.e("Error", "Request Failed: " + e.getMessage());
                runOnUiThread(() -> {
                    Toast.makeText(LianXiKeFuActivity.this, "请求失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
            }

            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    runOnUiThread(() -> {
                        loadingIndicator.setVisibility(View.GONE);
                        Toast.makeText(LianXiKeFuActivity.this, "无数据", Toast.LENGTH_SHORT).show();
                    });
                    return;
                }
                //如若成功,则获取成功后的json数据,查看他的json数据是什么样子的,,,,然后json数据是一个大的list列表,客服回复的的内容都是拆开的,所以现在我要将内容全部拼接到一块然后储存到数据库中/
                String jsonResponse = response.body().string(); // 获取响应体
                Log.e("json",jsonResponse);

                // 处理 JSON 响应
                //TODO 获取ai 回复的内容
                String botResponse = processJsonResponse(jsonResponse);

                // 在主线程更新 UI    插入数据库中
                runOnUiThread(() -> {
                    if (!botResponse.isEmpty()) {
                        loadingIndicator.setVisibility(View.GONE);
                        sendButton.setEnabled(true); // 启用发送按钮
                        messageList.add(new MessageBean(botResponse, false)); // 添加机器人的回复
                        messageAdapter.notifyItemInserted(messageList.size() - 1);
                        messageRecyclerView.scrollToPosition(messageList.size() - 1); // 滚动到最新消息
                        messageDatabaseHelper.insertMessage(botResponse, false); // 插入机器人的消息到数据库
                    }
                });
            }
        });
    }

    // 处理 JSON 响应 处理json数据然后将content拼接.    拼接
    private String processJsonResponse(String jsonResponse) {
        StringBuilder responseBuilder = new StringBuilder();
        // 按行拆分响应
        String[] responseLines = jsonResponse.split("\\n");
        for (String line : responseLines) {
            if (line.startsWith("data:")) {
                String jsonString = line.substring(5).trim(); // 去掉前缀 "data:"
                if (jsonString.equals("[DONE]")) {
                    break; // 结束标记
                }
                try {
                    // 解析 JSON 数据
                    JSONObject jsonObject = new JSONObject(jsonString);
                    JSONArray choicesArray = jsonObject.getJSONArray("choices");
                    for (int i = 0; i < choicesArray.length(); i++) {
                        JSONObject choice = choicesArray.getJSONObject(i);
                        JSONObject delta = choice.getJSONObject("delta");
                        String content = delta.getString("content");
                        // 拼接内容
                        responseBuilder.append(content);
                    }
                } catch (JSONException e) {
                    Log.e("Error", "JSON 解析错误: " + e.getMessage());
                }
            }
        }
        Log.e("拼接的内容:",responseBuilder.toString());
        return responseBuilder.toString(); // 返回拼接后的内容
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…

Mongodb基础用法【总结】

关系型数据库和非关系型数据库的区别 关系型数据库 1.在关系型数据库中&#xff0c;数据都是存储在表中的&#xff0c;对存储的内容有严格的要求 2.因为我们在创建表的时候久已经规定了表中的字段 存储的数据类型 是否为空 唯一标识等规则 3.由于操作的都是结构化的数据&#…

一款.NET开源的i茅台自动预约小助手

前言 今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约&#xff08;抢茅台&#xff09;小助手&#xff1a;HyggeImaotai。 项目介绍 该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能&#xff0c;软件会在指定时间开始对管理的用…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第六篇-阶段总结篇】

因为马上就要进入下一个阶段&#xff0c;制作动态编辑体积纹理的模块。 但在这之前&#xff0c;要在这一章做最后一些整理。 首先&#xff0c;我们完成没完成的部分。其次&#xff0c;最后整理一下图表。最后&#xff0c;本文附上正在用的贴图 完善Shader 还记得我们之前注…

HBuilder X 中Vue.js基础使用1(三)

一、 模板语法 Vue 使用一种基于 HTML 的模板语法&#xff0c;使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML&#xff0c;可以被符合规范的浏览器和 HTML 解析器解析。 英文官网: Vue.js - The Progressive JavaScript Fr…

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…

Turn-it:优化线材重构雕塑制造

&#x1f428;文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略&#xff0c;通过调整目标形状以适应电线弯曲机&#xff0c;然后由人工将其弯曲回目标形状。&#xff08;机器弯曲人工弯曲&#xff09; 该方法通过两阶段弯曲策略实现&a…

力扣——用队列实现栈(C语言)

目录 题目&#xff1a; 原理&#xff1a; 结构体MyStack 出栈void myStackPop(MyStack* obj) 入栈void myStackPush(MyStack* obj, int x) 读取栈顶元素int myStackTop(MyStack* obj) 判断栈空bool myStackEmpty(MyStack* obj) 销毁栈void myStackFree(MyStack* obj) 整…

NewStar CTF 2024 Week1,Week2部分

WP部分学习官方解题思路&#xff0c;这次比赛还是收获满满呀 web方向&#xff1a; headach3 抓包拿到flag 会赢吗 第一关&#xff1a; 查看源码看到flag第一部分和目录 第二关&#xff1a; 查看js文件 revealflag方法传入了一个className参数 <script>async func…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

燕山大学23级经济管理学院 10.18 C语言作业

燕山大学23级经济管理学院 10.18 C语言作业 文章目录 燕山大学23级经济管理学院 10.18 C语言作业1C语言的基本数据类型主要包括以下几种&#xff1a;为什么设计数据类型&#xff1f;数据类型与知识体系的对应使用数据类型时需要考虑的因素 21. 逻辑运算符2. 真值表3. 硬件实现4…

最大公约数(公式法)

求多个数的最大公约数 采用连续求gcd的方式 题目 ACCODE #include<bits/stdc.h> using namespace std; long long num[4]; int main(){cin>>num[1]>>num[2]>>num[3];sort(num1,num4);// cout<<num[1]<<" "<<num[2]<&…

尚硅谷spark学习

p4 快速上手 -开发环境准备

Java多线程新手指南:从零开始学习多线程创建,有两下子!

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴 bug菌&#xff0c;今天又来给大家手把手教学Java SE系列知识点啦&#xff0c;赶紧出来哇&#xff0c;别躲起来啊&#xff0c;听我讲干货记得点点赞&#xff0c;赞多了我就更有动力讲得更欢哦&#xff01;所以呀&…

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…

KASan部署、使用与原理分析

文章目录 前言1、概述2、使用方法3、测试用例3.1、检测加载的内核模块3.2、检测调用的内核模块3.3、通过系统调用检测3.4、检测编译到Linux内核中的内核模块 4、工作原理4.1、影子内存&#xff08;Shadow Memory&#xff09;4.2、内存状态&#xff08;Memory States&#xff09…

海南聚广众达电子商务咨询有限公司靠谱吗怎么样?

在当今这个数字化浪潮席卷全球的时代&#xff0c;抖音电商以其独特的魅力成为了众多商家争相入驻的新蓝海。而在这片浩瀚的电商海洋中&#xff0c;如何找到一家既专业又可靠的合作伙伴&#xff0c;成为了众多商家心中的一大难题。今天&#xff0c;我们就来深入剖析一下海南聚广…

爬虫日常实战

爬取美团新闻信息&#xff0c;此处采用两种方法实现&#xff1a; 注意点&#xff1a;因为此处的数据都是动态数据&#xff0c;所以一定要考虑好向下滑动数据包会更新的情况&#xff0c;不然就只能读取当前页即第一页数据&#xff0c;方法一通过更新ajax数据包网址页数&#xf…

转变软件交付方式:通过统一 API 和测试策略提高质量和速度

API 在当今的数字化转型中至关重要&#xff0c;但无缝交付也同样重要。然而&#xff0c;许多组织仍然分散其 API 开发和 UI 测试流程&#xff0c;导致问题检测延迟、发布时间延长&#xff0c;甚至遗漏错误。在快节奏的环境中&#xff0c;这种方法是不可持续的&#xff0c;因为上…

Java调用上传文件接口

以 QAnthing 上传文件&#xff08;POST&#xff09;接口为例&#xff0c;展示Java如何调用上传文件接口。 接口文档如下&#xff1a; QAnthign接口文档地址 上代码&#xff1a; RestTemplate 版 /** * * param url 接口地址 * param filePath 文件本地路径 */ public vo…