共计 3026 个字符,预计需要花费 8 分钟才能阅读完成。
背景痛点
在 Android 端集成 ChatGPT 时,开发者常遇到以下问题:

- 网络延迟:移动网络不稳定导致 API 响应慢,影响用户体验
- Token 管理:API 密钥的安全存储和自动刷新机制复杂
- 响应解析 :处理流式响应(SSE) 格式数据需要特殊处理
- 权限问题:Android 12+ 的网络权限限制导致部分功能异常
技术选型
官方 OpenAI API
- 优点:功能最全,更新及时,官方文档完善
- 缺点:需要自行处理所有网络请求和响应解析
第三方封装库(如 ChatGPT-Android)
- 优点:开箱即用,简化了 API 调用流程
- 缺点:灵活性差,依赖库更新可能滞后
对于大多数项目,我们建议直接使用官方 API,以获得更好的控制和灵活性。
核心实现
OkHttp 实现分块下载与本地缓存
// 创建带缓存的 OkHttpClient
val cacheSize = 10 * 1024 * 1024 // 10MB
val cache = Cache(File(context.cacheDir, "http_cache"), cacheSize.toLong())
val client = OkHttpClient.Builder()
.cache(cache)
.addInterceptor { chain ->
val request = chain.request()
// 尝试从缓存获取响应
val cachedResponse = cache.get(request)
if (cachedResponse != null && cachedResponse.isNotModified) {return@addInterceptor cachedResponse}
chain.proceed(request)
}
.build()
Retrofit+Coroutine 处理流式响应
interface OpenAIApiService {
@Streaming
@POST("v1/chat/completions")
suspend fun chatCompletion(@Body request: ChatRequest): Response<ResponseBody>
}
// 解析 SSE 数据
fun parseSSEResponse(response: ResponseBody): Flow<String> = flow {val reader = response.byteStream().bufferedReader()
try {while (true) {val line = reader.readLine() ?: break
if (line.startsWith("data:")) {val data = line.substringAfter("data:").trim()
emit(data)
}
}
} finally {reader.close()
}
}
性能优化
Header 压缩
val client = OkHttpClient.Builder()
.addInterceptor(GzipRequestInterceptor()) // 自定义 Gzip 压缩拦截器
.build()
class GzipRequestInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val originalRequest = chain.request()
val compressedRequest = originalRequest.newBuilder()
.header("Content-Encoding", "gzip")
.method(originalRequest.method, gzip(originalRequest.body))
.build()
return chain.proceed(compressedRequest)
}
}
网络状态监听
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback = object : ConnectivityManager.NetworkCallback() {override fun onAvailable(network: Network) {// 网络恢复}
override fun onLost(network: Network) {
// 网络断开
// 可以在此处切换到本地缓存模式
}
}
connectivityManager.registerNetworkCallback(NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build(),
networkCallback
)
避坑指南
Android 12+ 网络权限
在 AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
对于 Android 12+,还需要处理受限网络:
val spec = NetworkSpecifier.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.setNetworkSpecifier(spec)
.build()
gRPC vs RESTful
- gRPC:适合高性能、低延迟场景,但增加包体积
- RESTful:兼容性好,调试方便,适合大多数应用
代码规范
所有 Kotlin 代码遵循以下规范:
- 使用 Jetpack Compose 风格的状态管理
- ViewModel 中使用
StateFlow而不是LiveData - 网络请求使用协程作用域管理
- 关键函数添加中文注释
/**
* 处理 ChatGPT 流式响应
* @param response 来自 API 的原始响应
* @return 解析后的消息流
*/
fun processStreamingResponse(response: ResponseBody): Flow<String> {// 实现细节...}
延伸思考
在弱网环境下保证对话连贯性是一个复杂的问题,我们可以考虑以下方向:
- 本地缓存最近对话内容
- 实现消息队列和重试机制
- 使用差分更新减少数据传输量
- 预加载可能的回复
你有哪些好的解决方案?欢迎在评论区分享你的想法。
测试环境
本文所有性能数据基于以下环境测试:
– 设备:Pixel 6
– 系统:Android 13
– 网络:Wi-Fi 6
– API 版本:OpenAI v1
希望这篇指南能帮助你顺利在 Android 应用中集成 ChatGPT 功能!
正文完
发表至: 未分类
近两天内
