十分钟教你搭建类似ChatGPT的安卓应用程序

news2024/11/28 1:46:12

大家好,我是易安!

Chat GPT 是当今著名的人工智能工具,就像聊天机器人一样。Chat GPT会回答发送给它的所有查询。今天,我将通过集成 OpenAI API (ChatGPT)构建一个简单的类似 ChatGPT 的 android 应用程序,我们可以在其中提出任何问题并获得答案。

如何使 ChatGPT 像 Android 应用程序一样
如何使 ChatGPT 像 Android 应用程序一样

详细步骤

第 1 步:在 Android Studio 中创建一个新项目

要在 Android Studio 中创建新项目,以 Kotlin 作为编程语言为例。

第 2 步:在 build.gradle 文件中添加以下依赖项

下面是 Volley 的依赖项,我们将使用它从 API 获取数据。要添加此依赖项,请导航至 app > Gradle Scripts > build.gradle(app) 并在 dependencies 部分添加以下依赖项。我们使用 Picasso 依赖项从 URL 加载图像。

// 下一行用于 volley 库
实现 'com.android.volley:volley:1.2.0'

添加此依赖项后,同步您的项目,然后转到 AndroidManifest.xml 部分。

第三步:在AndroidManifest.xml文件中添加上网权限

导航到应用 > AndroidManifest.xml 并向其中添加以下代码。

  • XML
<!--permissions for INTERNET-->
<uses-permission android:name="android.permission.INTERNET"/>

第 4 步:使用 activity_main.xml 文件

导航到 app > res > layout > activity_main.xml 并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。

  • XML
<?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:background="@color/back_color"
 tools:context=".MainActivity">

 <ScrollView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_above="@id/idTILQuery"
  android:layout_alignParentTop="true"
  android:layout_margin="5dp"
  android:padding="5dp">

  <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">

   <!-- text view for displaying question-->
   <TextView
    android:id="@+id/idTVQuestion"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="30dp"
    android:padding="4dp"
    android:text="Question"
    android:textColor="@color/white"
    android:textSize="17sp" />

   <!-- text view for displaying response-->
   <TextView
    android:id="@+id/idTVResponse"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="5dp"
    android:padding="4dp"
    android:text="Response"
    android:textColor="@color/white"
    android:textSize="15sp" />
  </LinearLayout>

 </ScrollView>
 <!-- text field for asking question-->
 <com.google.android.material.textfield.TextInputLayout
  android:id="@+id/idTILQuery"
  style="@style/TextInputLayoutStyle"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true"
  android:layout_margin="5dp"
  android:hint="Enter your query"
  android:padding="5dp"
  android:textColorHint="@color/white"
  app:hintTextColor="@color/white">

  <com.google.android.material.textfield.TextInputEditText
   android:id="@+id/idEdtQuery"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@color/edt_back_color"
   android:drawableEnd="@drawable/ic_send"
   android:drawableTint="@color/white"
   android:ems="10"
   android:imeOptions="actionSend"
   android:importantForAutofill="no"
   android:inputType="textEmailAddress"
   android:textColor="@color/white"
   android:textColorHint="@color/white"
   android:textSize="14sp" />
 </com.google.android.material.textfield.TextInputLayout>
</RelativeLayout>

第 5 步:生成使用 API 的不记名令牌。

导航到以下URL (openai获取你的api key),只需使用您的电子邮件和密码注册即可。在此屏幕上单击创建新密钥以生成新密钥。生成您的密钥后,我们必须将其用作制作 API 密钥的令牌。

第 6 步:使用 MainActivity.kt 文件。

导航到 app > java > 你的应用程序包名称 > MainActivity.kt 文件并向其中添加以下代码。

这里选择的模型text-davinci-003,当然你可以选择其他3.5的模型

  • Kotlin
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import android.widget.TextView.OnEditorActionListener
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.RetryPolicy
import com.android.volley.VolleyError
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.android.material.textfield.TextInputEditText
import org.json.JSONObject

class MainActivity : AppCompatActivity() {

 // creating variables on below line.
 lateinit var responseTV: TextView
 lateinit var questionTV: TextView
 lateinit var queryEdt: TextInputEditText

 var url = "https://api.openai.com/v1/completions"

 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  
  responseTV = findViewById(R.id.idTVResponse)
  questionTV = findViewById(R.id.idTVQuestion)
  queryEdt = findViewById(R.id.idEdtQuery)

  
  queryEdt.setOnEditorActionListener(OnEditorActionListener { v, actionId, event ->
   if (actionId == EditorInfo.IME_ACTION_SEND) {
    
    responseTV.text = "Please wait.."
    
    if (queryEdt.text.toString().length > 0) {
     
     getResponse(queryEdt.text.toString())
    } else {
     Toast.makeText(this, "Please enter your query..", Toast.LENGTH_SHORT).show()
    }
    return@OnEditorActionListener true
   }
   false
  })
 }

 private fun getResponse(query: String) {
  
  questionTV.text = query
  queryEdt.setText("")
  
  val queue: RequestQueue = Volley.newRequestQueue(applicationContext)
  
  val jsonObject: JSONObject? = JSONObject()
  
  jsonObject?.put("model""text-davinci-003")
  jsonObject?.put("prompt", query)
  jsonObject?.put("temperature", 0)
  jsonObject?.put("max_tokens", 100)
  jsonObject?.put("top_p", 1)
  jsonObject?.put("frequency_penalty", 0.0)
  jsonObject?.put("presence_penalty", 0.0)

  
  val postRequest: JsonObjectRequest =
   
   object : JsonObjectRequest(Method.POST, url, jsonObject,
    Response.Listener { response ->
     
     val responseMsg: String =
      response.getJSONArray("choices").getJSONObject(0).getString("text")
     responseTV.text = responseMsg
    },
    
    Response.ErrorListener { error ->
     Log.e("TAGAPI""Error is : " + error.message + "\n" + error)
    }) {
    override fun getHeaders(): kotlin.collections.MutableMap<kotlin.String, kotlin.String> {
     val params: MutableMap<String, String> = HashMap()
    
     params["Content-Type"] = "application/json"
     params["Authorization"] =
      "Bearer Enter your token here"
     return params;
    }
   }

  
  postRequest.setRetryPolicy(object : RetryPolicy {
   override fun getCurrentTimeout(): Int {
    return 50000
   }

   override fun getCurrentRetryCount(): Int {
    return 50000
   }

   @Throws(VolleyError::class)
   override fun retry(error: VolleyError) {
   }
  })
  
  queue.add(postRequest)
 }
}

最终运行结果:

alt

多年没开发安卓的我,也能在很短的时间不费吹飞之力搭建出来,你也赶紧去试试吧!之后我还会出一些更加详细的搭建教程,感谢阅读!

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【docker_centos7】docker在centos7中如何安装??

Docker &#xff1f;&#xff1f;&#xff1f;What&#xff1f;&#xff1f;&#xff1f; Docker是一种开源的容器化平台&#xff0c;可以让开发者轻松地构建、打包、运输和部署应用程序。Docker容器是轻量级的、可移植的、自包含的软件包&#xff0c;其中包含了应用程序和其所…

Pytorch pth 格式转ONNX 格式

目录 背景介绍 安装依赖库 转换成onnx 格式 ONNX 转换成TensorRT 格式 背景介绍 PyTorch 训练的模型&#xff0c;需要在Jetson nano 上部署&#xff0c;jetson 原生提供了TensorRT 的支持&#xff0c;所以一个比较好的方式是把它转换成ONNX 格式&#xff0c;然后在通过ONNX …

给Debian 11系统,添加右键时,使用其它程序打开】

VS Code 添加到文件管理器的右键菜单中 在 Debian 系统中&#xff0c;nautilus-actions 软件包已经被移除了。因此&#xff0c;如果你想将 VS Code 添加到文件管理器的右键菜单中&#xff0c;你需要使用 nautilus-admin 工具。下面是详细步骤&#xff1a; 打开终端应用程序。运…

弃用 Docker 后!哪几种超好用的容器工具能替代?

2020 年底&#xff0c;Kubernetes 发布了公告&#xff0c;官方宣布从 v1.24 开始停止对 Docker 的支持。然而&#xff0c;Kubernetes 弃用 docker 对我们的影响不应过于恐慌。 有以下几种工具可以替代 Docker &#xff1f;并且相比 Docker 都有哪些优点&#xff1f; containe…

JRebel插件热部署快速入门教程

文章目录 引入插件安装插件激活打开激活窗口激活插件 插件使用设置项目热更新热更新说明演示热更新 引入 Jrebel能够非常方便的帮助我们进行项目的热更新&#xff0c;尤其是前端也嵌在后端工程中的单体项目&#xff0c;热更新能减少一半的开发时间&#xff0c;这里我们演示一下…

分布式缓存Redis 面试突击

Redis分布式锁 单机版 关于 synchronized 和trylock的区别 前者 是 不见不散 我一定要等到你 后者是 过时不候 我尝试一下 获取不到就算了 可以设置一个时间 这个时间范围内获取不到就算了 用缓存两个目的&#xff1a;高性能与高并发 高性能&#xff1a;减少了查询…

使用Linkage Mapper制作环境连接图

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Linkage Mapper解密数字世界链接 文章目录 引言一. 简介1.1 Linkage Mapper 概述1.2 环境连接…

基于html+css的图展示55

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

DJ5-8 磁盘存储器的性能和调度

目录 5.8.1 磁盘性能简述 1、磁盘的结构和布局 2、磁盘的类型 3、磁盘数据的组织和格式 4、磁盘的访问过程 5、磁盘访问时间 5.8.2 磁盘调度算法 1、先来先服务 FCFS 2、最短寻道时间优先 SSTF 3、扫描算法&#xff08;电梯算法&#xff09;SCAN 4、循环扫描算法 …

4 IK分词器

4 IK分词器 4.1测试分词器 在添加文档时会进行分词&#xff0c;索引中存放的就是一个一个的词&#xff08;term&#xff09;&#xff0c;当你去搜索时就是拿关键字去匹配词&#xff0c;最终 找到词关联的文档。 测试当前索引库使用的分词器&#xff1a; post 发送&#xff…

Python计算语义分割模型的评价指标

目录 一、混淆矩阵 二、分类指标 1、Accuracy(准确率&#xff09; 2、Precision&#xff08;查准率&#xff09; 3、Recall &#xff08;查全率&#xff09; 4、F1-score 三、语义分割的评价指标 1、MPA(类别平均像素准确率) 2、IoU(交并比) 3、MIoU(平均交并比) 4…

STL-stack容器和queue容器

stack概念&#xff1a;stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为 与queue相似&#xff0c;stack也是一个适配器类&#xff0c;它给底层vector提供了典型的栈接…

C语言——数组

哈喽&#xff0c;大家好&#xff0c;今天我们要学习的是数组的相关知识。 目录 1.什么是数组 2.一维数组 2.1一维数组的创建和初始化 2.2一维数组的使用 2.3一位数组在内存中的存储 3.二维数组 3.1二维数组的创建和初始化 4.2二维数组的使用 4.3二位数组在内存中的存储…

java安全编码规范(0)

JAVA安全编码标准 有这么一指导书&#xff0c;新手可以去看看&#xff0c;这里主要从实践总结&#xff0c;随时会更新。 主要从十个方面去了解下&#xff0c;实际上远远不只这些哦。 ​​​​​​​ 1、引用java security library 环境需求 Java 8Maven 3 a、编译jar包&a…

「锂」清思绪,触达未来 | 锂电池企业如何实现数字化破局?

锂电池制造的困局与破局 锂电池行业产业链的上游主要为正负极材料、电解液、电极基材、隔膜等领域的供应商&#xff1b;中游为电芯制造及封装行业&#xff1b;下游则主要是动力电池、消费电子等锂电池的应用领域。 图1&#xff1a;锂电池行业产业链 近年来&#xff0c;随着相…

虹科方案 | 适用于高压环境或潜在爆炸性环境的加速度计系统

PART 1 加速度系统 加速度计系统通常用于测量振动或运动。测量系统能够记录一个、两个或三个空间方向的运动。所实际使用的传感器是光纤传感器&#xff0c;可提供不受电磁干扰影响的可靠测量值。当然&#xff0c;这样的系统具有高可靠性&#xff0c;即使在不断变化的天气条件下…

转置卷积(Transposed Convolution)可视化过程

目录 1. 介绍2. 标准卷积3. 转置卷积4. 总结 1. 介绍 转置卷积&#xff08;Transposed Convolution&#xff09;经常也被称作反卷积&#xff0c;所谓反卷积即为通过标准卷积层生成的输出被反卷积&#xff0c;将得到原始输入。而转置卷积不按值反转标准卷积&#xff0c;而仅按维…

STM32F4_待机唤醒详解

目录 1. 低功耗模式 1.1 降低系统时钟速度 1.2 外设时钟门控 2. 睡眠模式 2.1 进入睡眠模式 2.2 退出休眠模式 3. 停止模式 3.1 进入停止模式 3.2 退出停止模式 4. 待机模式 4.1 进入待机模式 4.2 退出待机模式 4.3 电源控制寄存器&#xff1a;PWR_CR 4.4 电源控…

‘OpenpyxlWriter‘ object has no attribute ‘save‘

使用read_sql(sql,conn)来获取数据库查询的结果&#xff0c; 在将处理完成的表格保存下来时&#xff0c;可能会显示如下错误&#xff1a; 将writer.save()改成writer._save()就可以解决这个问题了。

必须了解的mysql三大日志-binlog、redo log和undo log

目录 一&#xff0c;前言二&#xff0c;binlog-备份日志1&#xff0c;作用2&#xff0c;使用场景3&#xff0c;日志形式4&#xff0c;binlog刷盘时机 三&#xff0c;redo log-重做日志1&#xff0c;概念2&#xff0c;为什么需要redo log3&#xff0c;日志形式4&#xff0c;redo…