向 Android 应用添加 Gemini 功能

1. 准备工作

通过 Firebase AI Logic,Gemini Developer API 可让您使用 Gemini 模型系列中的生成式 AI 模型,还可以打造迄今为止尚未实现的新体验。

此 Codelab 将指导您向 Jetnews 应用添加总结功能。Jetnews 是一款新闻阅读应用,构建该应用所用的 Jetpack Compose 属于 compose-samples 代码库的一部分。

JetNews 应用的实际运用

在此 Codelab 中,您将执行以下操作:

  • 在 Google AI Studio 中编写提示,用于总结新闻报道,
  • 将 Firebase AI Logic SDK 集成到 Jetnews 中。
  • 在报道视图顶部添加“Gemini 摘要”部分,在底部栏中添加“总结”按钮。

7eee9f1dcad682c.png

Jetnews 应用的总结功能由 Gemini API 提供支持

前提条件

  • 具备 Kotlin 基础知识
  • 熟悉如何使用 Android Studio,以及如何在搭载 Android API 级别 23 或更高版本的模拟器或实体设备中测试应用
  • 一个用于访问 Firebase 的 Google 账号

2. 设计提示

提示是指您的应用通过 Gemini API 发送给 Gemini 模型的消息,其中可以包括文本、图片、音频和视频文件。

为特定用例设计理想的提示与其说是科学,不如说是艺术,而且通常需要多次迭代。Google AI Studio 是一种 Google 工具,用于快速设计生成式 AI 模型的原型以及对此类模型进行测试,是设计提示的绝佳工具。

在此 Codelab 中,您需要将一篇技术文章的内容总结为四个要点。此提示的目标是确保摘要相关且为纯文本,且不带任何 Markdown 格式。

经过几次迭代后,您可能会发现效果特别好的提示。如下所示:

Summarize the core findings of the following article in 4 concise bullet points. Ensure each bullet point is specific, informative and relevant. Return just the bullet points as plain text. Don't use markdown.

[article body]

对输出结果满意后,您就可以将 Gemini API 集成到 Android 应用中。

3. 查看代码

首先,查看 GitHub 中的起始源代码:

git clone https://github.com/android/codelab-gemini-summary

Jetnews 应用是完全从零设计的,能够针对各种大小的移动设备进行扩缩。如需查看展示 Android 架构最佳实践的示例,您可以看看 Now In Android

详细了解 Jetnews 支持大屏设备的实现方法

如果 Jetnews 应用的源代码让您感到难以理解,请不要担心。要添加由 Gemini 提供支持的总结功能,您只需修改 GeminiRepositoryImpl 类中的代码。我们已为您实现可在应用中触发总结并显示摘要的代码。

最终实现

您可以通过查看此分支来直接访问源代码的最终实现:

git clone https://github.com/android/codelab-gemini-summary
git switch final

您需要按照本 Codelab 的第 4 步中详述的说明创建和设置 Firebase 项目。

4. 设置 Firebase 项目

创建 Firebase 项目

Firebase 控制台中创建 Firebase 项目。在“创建项目”工作流的第一步中输入新项目名称,创建一个新的 Firebase 项目。系统会自动创建底层 Google Cloud 项目。

在项目中,打开 AI 下拉菜单,然后选择“AI Logic”。

点击“get started”,然后启用 Gemini Developer API,这样您就可以免费开始使用,并获享丰厚的配额:

最后,启用 Gemini Developer API:

将应用连接到 Firebase

现在,您已经设置好 Firebase 项目,接下来您需要将 Android 应用连接到该项目。

  1. Firebase 控制台中,选择您的项目。
  2. 点击“添加应用”,然后选择“Android”。
  3. 按照屏幕上的说明操作,通过提供应用的软件包名称来注册您的应用。
  4. 下载 google-services.json 文件,并将其添加到应用的模块(应用级)根目录中。
  5. 继续按照屏幕上的说明操作,将 Google 服务 Gradle 插件和 Firebase 物料清单 (BoM) Gradle 依赖项添加到您的应用中。

!注意:不得将 google-services.json 公开提交到源代码控制系统。拥有公开访问权限的其他人可以使用该项目,但需要支付费用。

5. 更新 Gradle 导入项

Jetnews 应用使用 Gradle 版本目录功能,可帮助集中管理依赖项的版本。

  1. 如需为 Firebase AI Logic SDK 添加 Gradle 导入项,请将以下代码添加到 libs.versions.toml 文件中:
    [versions]
    ...
    firebase-bom = "34.4.0" // get the latest version from the Firebase documentation
    
    [libraries]
    ...
    firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref ="firebase-bom" }
    firebase-ai = { group = "com.google.firebase", name = "firebase-ai" }
    
    请注意,您无需为 firebase-ai 指定版本。使用最新版本的 Firebase BoM 会自动指定最新版本的 Firebase AI Logic SDK。
  2. 更新 build.gradle.kts
    implementation(platform(libs.firebase.bom))
    implementation(libs.firebase.ai)
    
  3. 点击“立即同步”,以提取 Gradle 工件。

如果您不想使用 Gradle 版本目录,可以直接在 build.gradle.kts 中添加导入项:

implementation(platform("com.google.firebase:firebase-bom:34.4.0"))
implementation("com.google.firebase:firebase-ai")

6. Kotlin 集成

您已经添加了相应的依赖项,接下来请更新 Kotlin 代码。

打开 GeminiRepositoryImpl 类。此类将包含与 Gemini API 交互的所有代码。

Gemini 模型初始化

GenerativeModel 实例化:

private val generativeModel = Firebase.ai(backend = GenerativeBackend.googleAI())
        .generativeModel(
            modelName = "gemini-2.5-flash",
            generationConfig = generationConfig {
                temperature = 0f
            },
            safetySettings = listOf(
                SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE),
                SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE),
            )
        )

在此示例中,您访问的是 Gemini 2.5 Flash 模型。此模型能够处理此示例的文本总结用例。如需详细了解可用的 Gemini 模型,请参阅 Firebase AI Logic 文档。

此示例还将温度值设为 0,从而更好地确保摘要生成的一致性。如需详细了解模型配置参数,请参阅 Firebase AI Logic 文档。

最后,此示例定义了安全设置,以确保模型在回答中使用恰当的语言。如需详细了解安全设置功能,请参阅 Firebase AI Logic 文档。

使用 Gemini 进行总结

接下来,更新 summarizePost() 函数,对作为参数传递的帖子进行总结。

首先,通过将帖子的所有段落合并成一个字符串来获取文本,然后将其传递给模型:

val postString = StringBuilder()
for (paragraph in post.paragraphs) {
  postString.append(paragraph.text)
}

根据本 Codelab 的第 2 步中设计的提示创建 prompt,并传入帖子内容:

val prompt =
            "Summarize the following article in 4 concise bullet points. " +
                    "Ensure each bullet point is specific, informative and relevant. " +
                    "Return just the bullet points as plain text. " +
                    "Use plain text, don't use markdown. \n $postString"

最后,将提示传递给模型并返回回答:

return generativeModel.generateContent(prompt).text

测试实现

如需测试实现,请在 Android Studio 中点击“Run app”,然后在模拟器或实体设备上安装 Jetnews 应用。

在首页打开任意报道,然后点击底部栏中的“总结”按钮:

触发 Gemini 总结的按钮

您应该会看到报道顶部显示的“Gemini 摘要”部分,该部分位于报道插图下方:

显示在报道顶部的“Gemini 摘要”部分

Jetnews 应用架构

Jetnews 旨在展示 Jetpack Compose 的最新界面功能。它是为了支持不同的屏幕尺寸而实现的(如需了解详情,请参阅这篇博文)。

此 Codelab 的目的并非深入了解 Jetnews 应用架构的细节。Gemini 集成主要发生在 GeminiRepositoryImpl 类中。

不过,如果您想了解按钮如何触发总结,可以查看 JetnewsIcons.kt 中的 SummaryButton()。您还可以查看 PostContent.ktSummarySection() 函数中的总结界面的界面实现。

7. 总结

在此 Codelab 中,您学习了如何执行以下操作:

  • 在 Google AI Studio 中创建并测试提示。
  • 在 Firebase 中设置项目以使用 Firebase AI Logic SDK,
  • 配置 Gradle 依赖项,以便在 Android 应用中使用 Firebase AI Logic,
  • 从 Kotlin 代码调用 Gemini 2.5 Flash。

如果您想探索 Firebase AI Logic,可以查看 Android AI 代码示例文档