当前位置: 首页 > news >正文

Android 接入deepseek

          DeepSeek 作为一款强大的 AI 开发工具,能够显著提升开发效率,尤其是在代码生成、错误检测和性能优化方面表现出色。本文将手把手教你如何在 Android Studio 中接入 DeepSeek,并充分发挥其潜力,让你在开发过程中事半功倍,下面介绍怎么接入。

一、前期准备

首先去DeepSeek注册账号,然后充值十块钱进去测试,并创建key,需要记住保存该key,否则下次需要重新创建

二、功能实现

1. manifest添加网络权限
 <uses-permission android:name="android.permission.INTERNET">
2.添加布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><ScrollViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><!-- 使用水平 LinearLayout 包含 ImageView 和 EditText --><androidx.appcompat.widget.LinearLayoutCompatandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="8dp"><!-- 左侧的图片 --><androidx.appcompat.widget.AppCompatImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="top"/><!-- 右侧的 EditText --><androidx.appcompat.widget.AppCompatEditTextandroid:id="@+id/result"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:gravity="top"android:hint="请等待AI分析解答..."android:inputType="textMultiLine"android:minHeight="200dp"android:paddingStart="8dp"android:scrollbars="vertical"tools:ignore="RtlSymmetry" /> <!-- 文本与图片之间的间距 --></androidx.appcompat.widget.LinearLayoutCompat></ScrollView><Viewandroid:layout_width="match_parent"android:layout_height="50dp" /><ProgressBarandroid:id="@+id/loading"android:visibility="gone"android:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"/><!-- 底部输入部分 --><androidx.appcompat.widget.LinearLayoutCompatandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><androidx.appcompat.widget.AppCompatEditTextandroid:id="@+id/et_input"android:layout_width="match_parent"android:layout_height="200dp"android:gravity="top"android:hint="请输入要发送的内容"android:inputType="textMultiLine" /><androidx.appcompat.widget.AppCompatButtonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="发送" /></androidx.appcompat.widget.LinearLayoutCompat></androidx.appcompat.widget.LinearLayoutCompat>
3.请求数据

        请求的数据,json格式

{"messages": [{"content": "You are a helpful assistant","role": "system"},{"content": "Hi","role": "user"}],"model": "deepseek-chat","frequency_penalty": 0,"max_tokens": 4096,"presence_penalty": 0,"response_format": {"type": "text"},"stop": null,"stream": false,"stream_options": null,"temperature": 1,"top_p": 1,"tools": null,"tool_choice": "none","logprobs": false,"top_logprobs": null
}

content就是我们要搜索的内容,

model就是我们使用的训练模型,

temperature是我们要使用的场景

4.build.gradle配置
 implementation 'com.squareup.okhttp3:okhttp:4.9.3'implementation 'com.fasterxml.jackson.core:jackson-databind:2.20.0' //JSON 数据处理implementation 'com.google.code.gson:gson:2.13.1' //JSON 序列化/反序列化
5.返回数据,后续请求成功后可以按照这个去解析
{"id": "string","choices": [{"finish_reason": "stop","index": 0,"message": {"content": "string","reasoning_content": "string","tool_calls": [{"id": "string","type": "function","function": {"name": "string","arguments": "string"}}],"role": "assistant"},"logprobs": {"content": [{"token": "string","logprob": 0,"bytes": [0],"top_logprobs": [{"token": "string","logprob": 0,"bytes": [0]}]}],"reasoning_content": [{"token": "string","logprob": 0,"bytes": [0],"top_logprobs": [{"token": "string","logprob": 0,"bytes": [0]}]}]}}],"created": 0,"model": "string","system_fingerprint": "string","object": "chat.completion","usage": {"completion_tokens": 0,"prompt_tokens": 0,"prompt_cache_hit_tokens": 0,"prompt_cache_miss_tokens": 0,"total_tokens": 0,"completion_tokens_details": {"reasoning_tokens": 0}}
}
6.代码实现

这个配置会一次行返回所有结果,如果需要直接返回,像网页那样一字一字打印显示,需要设置

params["stream"] = true,然后再处理数据流即可,拼接数据可以使用

val stringBuffer = StringBuffer(),具体可以自行实现,KEY就是官网申请的API key,替换成自己的即可。

   private var params: HashMap<String, Any?> = HashMap()// 构建 messages 列表private var messages: MutableList<HashMap<String, Any?>> = ArrayList()private var message: HashMap<String, Any?> = HashMap()private val client = OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).build()private fun request() {binding.loading.visibility = View.VISIBLEval content: String = binding.etInput.getText().toString()message["content"] = contentmessage["role"] = "user"messages.add(message)// 填充 paramsparams["messages"] = messagesparams["model"] = "deepseek-chat"params["frequency_penalty"] = 0params["max_tokens"] = 2048params["presence_penalty"] = 0// 嵌套对象 response_formatval responseFormat: MutableMap<String, Any> = HashMap()responseFormat["type"] = "text"params["response_format"] = responseFormat// 其他字段params["stop"] = nullparams["stream"] = falseparams["stream_options"] = nullparams["temperature"] = 1.3params["top_p"] = 1params["tools"] = nullparams["tool_choice"] = "none"params["logprobs"] = falseparams["top_logprobs"] = nullval mediaType: MediaType? = "application/json".toMediaTypeOrNull()val objectMapper = ObjectMapper()var jsonString1: String? = nulltry {jsonString1 = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(params)} catch (e: JsonParseException) {throw RuntimeException(e)}val body: RequestBody = jsonString1.toRequestBody(mediaType)val request = Request.Builder().url("https://api.deepseek.com/chat/completions").method("POST", body).addHeader("Content-Type", "application/json").addHeader("Accept", "application/json").addHeader("Authorization", "Bearer $KEY").build();val time = System.currentTimeMillis()client.newCall(request).enqueue(object : Callback {override fun onFailure(call: Call, e: IOException) {LogUtils.i(TAG,"onFailure =${e.message}")binding.loading.visibility = View.GONE}override fun onResponse(call: Call, response: Response) {if (response.body==null){LogUtils.i(TAG,"onResponse body is null")launchMain {binding.loading.visibility = View.GONE}return}//onResponseCall(call,response)try {val jsonString = response.body?.string()LogUtils.i(TAG,"onResponse   body=${System.currentTimeMillis() - time}")val jsonObject = JsonParser.parseString(jsonString).asJsonObjectval choices = jsonObject.get("choices").asJsonArrayval choices0 = choices[0].asJsonObjectval message1 = choices0.get("message").asJsonObjectval result = message1.get("content").asStringLogUtils.i(TAG,"onResponse result=${result} jsonString=$jsonString")launchMain {binding.result.setText(result)binding.loading.visibility = View.GONE}}catch (e:Exception){LogUtils.i(TAG,"onResponse result=${e.message}")launchMain {binding.loading.visibility = View.GONE}}}})}

最后贴上效果,这样就可以让自己app集成deepseek,有问题也可以留言探讨。

http://www.xdnf.cn/news/1444699.html

相关文章:

  • 关于ES中文分词器analysis-ik快速安装
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
  • 【Bug】Nexus无法正常启动的五种解决方法
  • SuperMap GIS基础产品FAQ集锦(20250901)
  • Elasticsearch 数字字段随机取多值查询缓慢-原理分析与优化方案
  • 504 Gateway Timeout:服务器作为网关或代理时未能及时获得响应如何处理?
  • 揭秘设计模式:优雅地为复杂对象结构增添新功能-访问者模式
  • go语言面试之Goroutine详解
  • Linux使用-Linux系统管理
  • WPF里的几何图形Path绘制
  • 硬件驱动C51单片机——裸机(1)
  • 三、Scala方法与函数
  • 【面试场景题】1GB 大小HashMap在put时遇到扩容的过程
  • 安卓系统中IApplicationThread.aidl对应的是哪个类
  • 智慧交通管理信号灯通信4G工业路由器应用
  • 【小白笔记】移动硬盘为什么总比电脑更容易满?
  • 【LeetCode热题100道笔记】括号生成
  • 系统架构设计师备考第14天——业务处理系统(TPS)
  • WebAppClassLoader(Tomcat)和 LaunchedURLClassLoader(Spring Boot)类加载器详解
  • Llama v3 中的低秩自适应 (LoRA)
  • 51单片机-LED与数码管模块
  • 2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution
  • JetBrains 2025 全家桶 11合1 Windows直装(含 IDEA PyCharm、WebStorm、DataSpell、DataGrip等)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • 终于有人把牛客网最火的Java面试八股文整理出来了,在Github上获赞50.6K
  • 使用 PHP Imagick 扩展实现高质量 PDF 转图片功能
  • 特斯拉“宏图计划4.0”发布!马斯克:未来80%价值来自机器人
  • 超适合程序员做知识整理的 AI 网站
  • SQL 函数:使用 REPLACE进行批量文本替换
  • 嵌入式第四十五天(51单片机相关)