上周三下午,产品经理丢了个需求:'下周一演示,先搭个内嵌 H5 的 App 架子。'从零搭建一个 Android WebView 项目,虽然功能不复杂,但权限声明、Gradle 依赖、网络配置这些琐碎的部分每次都得重新查文档——一个不小心,要么漏权限,要么版本冲突。
不过那天我只用了十分钟。不是手速快,而是让 Claude 把那些重复性配置全干了。整个过程就像有个老手在旁边,你告诉他想要什么,他把代码、配置、甚至一些常识坑都帮你填好。
如果你也被类似的事折磨过,下面这套工作流或许能帮你省点命。
怎么把 Claude 请进 Android Studio
要让 Claude 直接在 IDE 里干活,得先把它集成进去。目前主流三种方式,我比较推荐第一种,因为能和当前项目上下文联动,生成的代码更贴切。
1. Android Studio 内置远程模型集成
从某个版本起,Android Studio 内置了对第三方 AI 模型的支持。在设置里找到:
Android Studio → Settings → Tools → AI → Model Providers
点击'Add',选择'Third-Party Remote Provider',然后填入 Claude 的 API 端点:
- Description: Claude API(自定义名称)
- URL:
https://api.anthropic.com - API Key: 你的 Claude API 密钥
提醒:远程模型意味着你的代码会被发送到第三方服务器。公司项目记得先脱敏,或者用本地部署的替代方案。
配置好后,在 AI 聊天窗口里把 Claude 设为默认模型。它能感知到你当前打开的文件、项目结构,甚至编译报错,比你贴代码到网页里聊强多了。
2. Claude Code 命令行工具
如果你习惯在终端里折腾,Claude Code 是个不错的选择。安装:
npm install -g @anthropic-ai/claude-code
claude --version
在项目根目录运行 claude,它会自动分析项目结构。批量生成文件或重构模块时尤其顺手。
3. 直接调 API
深度集成的场景下,直接走 API。写个简单的 Kotlin 客户端就能把 Claude 嵌入你自己的工具里:
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
class ClaudeClient(private val apiKey: String) {
private val client = OkHttpClient()
private val mediaType = "application/json".toMediaType()
suspend fun generateCode(prompt: String): String {
val requestBody = JSONObject().apply {
put("model", "claude-3-5-sonnet-20241022")
put("max_tokens", 4000)
put("messages", arrayOf(
JSONObject().apply {
put("role", "user")
put("content", prompt)
}
))
}.toString()
val request = Request.Builder()
.url("https://api.anthropic.com/v1/messages")
.addHeader("x-api-key", apiKey)
.addHeader("anthropic-version", "2023-06-01")
.addHeader("content-type", "application/json")
.post(requestBody.toRequestBody(mediaType))
.build()
val response = client.newCall(request).execute()
val responseBody = response.body?.string() ?: ""
return JSONObject(responseBody)
.getJSONArray("content")
.getJSONObject(0)
.getString("text")
}
}
环境准备
不管用哪种方式,开工前有几件事得先做好:
网络连通性:确保能访问 api.anthropic.com。公司内网有代理的话,在 Android Studio 的 HTTP Proxy 里配好。
curl -I https://api.anthropic.com
密钥管理:永远别把密钥硬编码。放在环境变量或本地配置文件里:
export CLAUDE_API_KEY="your-api-key-here"
版本控制:让 AI 改代码前,先打个 commit 保平安。我习惯每次生成前新建一个分支:
git add .
git commit -m "备份:开始用 Claude 生成 WebView 模块"
git checkout -b feature/claude-webview
给提示词下点功夫,别当谜语人
让 AI 写出能直接用的代码,提示词里得带够上下文。扔一句'写个 WebView',出来的东西大概率缺胳膊少腿。下面是我常用的结构:
- 技术栈与版本:Kotlin、最低 API 级别、目标 API 级别、是否用 ViewBinding
- 功能清单:加载什么 URL、是否启用 JavaScript、缓存策略、加载状态处理
- 权限需求:INTERNET 必须,如果需要访问外部存储就注明
- 代码结构:Activity、布局、Manifest 声明、Gradle 依赖
- 风格约定:Material Design 3、错误处理、Kdoc 注释
按这个模子写出来的指令大概是这样:
我需要一个 Android WebView 模块,具体要求:
1. 使用 Kotlin + ViewBinding,最低 API 24,目标 API 34
2. 加载 https://developer.android.com
3. 启用 JavaScript 和 DOM 存储,显示加载进度条
4. 处理网络错误,支持前进/后退导航
5. 生成 WebViewActivity、布局文件、Manifest 声明和 Gradle 依赖
6. 遵循 Material Design 3,添加适当的错误处理和注释
指令越具体,生成的代码越少折腾。花两分钟写清楚,能省下十几分钟的修补时间。
实战:一句话下去,代码就来了
我给 Claude 发了上面的提示词,它直接生成了完整的 Activity 和布局。下面这段是我从生成结果里摘出来的核心部分,注意它自动补上了进度条和错误处理——这些细节如果自己写,很容易漏掉。
WebViewActivity.kt
package com.example.webviewdemo
import android.os.Bundle
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import android.webkit.WebChromeClient
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import com.example.webviewdemo.databinding.ActivityWebViewBinding
class WebViewActivity : AppCompatActivity() {
private lateinit var binding: ActivityWebViewBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWebViewBinding.inflate(layoutInflater)
setContentView(binding.root)
setupWebView()
loadUrl("https://developer.android.com")
}
private fun setupWebView() {
binding.webView.settings.javaScriptEnabled = true
binding.webView.settings.domStorageEnabled = true
binding.webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: android.graphics.Bitmap?) {
super.onPageStarted(view, url, favicon)
binding.progressBar.isVisible = true
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
binding.progressBar.isVisible = false
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
super.onReceivedError(view, request, error)
binding.progressBar.isVisible = false
Toast.makeText(this@WebViewActivity, "加载失败: ${error?.description}", Toast.LENGTH_SHORT).show()
}
}
binding.webView.webChromeClient = object : WebChromeClient() {
// 可扩展处理进度、标题等
}
}
private fun loadUrl(url: String) {
binding.webView.loadUrl(url)
}
override fun onBackPressed() {
if (binding.webView.canGoBack()) {
binding.webView.goBack()
} else {
super.onBackPressed()
}
}
}
布局文件 activity_web_view.xml 它也给得很朴素:一个 WebView 加一个 ProgressBar,外层用 ConstraintLayout 包一下。Manifest 里自动声明了 INTERNET 权限和 Activity 注册。
这只是个起步架子,但已经把最磨人的活干了。剩下的就是根据业务往里填具体的 H5 页面链接、定制一下错误页样式,或者加个下拉刷新。
AI 不会帮你思考架构,但那些重复、易错的部分,它确实能分摊不少负担。

