在 Android 應用程式中新增 Gemini 功能

1. 事前準備

您可以透過 Firebase AI Logic 使用 Gemini Developer API,存取 Gemini 系列的生成式 AI 模型,打造前所未有的全新使用體驗。

本程式碼研究室會逐步引導您在 JetNews 應用程式中加入摘要功能。JetNews 是新聞閱讀應用程式,使用 compose-samples 存放區的 Jetpack Compose 部分建構而成。

JetNews 應用程式運作實例

本程式碼研究室涵蓋下列內容:

  • 在 Google AI Studio 中設計提示,用於生成新聞報導摘要。
  • 將 Firebase AI Logic SDK 整合至 JetNews
  • 在文章檢視畫面頂端新增「Gemini summary」專區,並在底部列中新增「Summarization」按鈕。

7eee9f1dcad682c.png

JetNews 應用程式採用 Gemini API 提供的摘要功能。

必要條件

  • 具備 Kotlin 基本知識
  • 熟悉 Android Studio 使用方式,且能在搭載 Android API 級別 23 以上版本的實體裝置或模擬器上測試應用程式
  • 可存取 Firebase 的 Google 帳戶

2. 設計提示

提示是指應用程式透過 Gemini API 傳送至 Gemini 模型的訊息,可包含文字、圖片、音訊和影片檔案。

為特定用途設計理想的提示,與其說是科學,不如說是一門藝術,而且通常需要經過多次疊代才能完成。Google AI Studio 是 Google 工具,用於快速設計生成式 AI 模型的原型以及測試此類模型,是設計提示的絕佳工具。

在本程式碼研究室中,您要將一篇技術文章的內容摘要出四個重點項目。這項提示的目標在於確保摘要與內容相關,且以純文字呈現,不含任何 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

請按照本程式碼實驗室步驟 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. 按一下「Sync now」即可擷取 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 模型。這個模型可處理本範例的文字摘要用途。請參閱 Firebase AI Logic 說明文件,進一步瞭解可用的 Gemini 模型

本範例也將溫度值設為 0,進一步確保摘要生成作業的一致性。請參閱 Firebase AI Logic 說明文件,進一步瞭解模型設定參數

最後,本範例定義了安全設定,確保模型能在回覆中生成適當的語言。請參閱 Firebase AI Logic 說明文件,進一步瞭解安全設定功能

使用 Gemini 生成摘要

接著,更新 summarizePost() 函式,針對以參數形式傳遞的貼文生成摘要。

首先,將所有段落合併為單個字串,以從貼文中獲取文本,然後將其傳遞給模型:

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

根據在本程式碼實驗室步驟 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 summary」專區:

文章頂端的 Gemini 摘要專區

JetNews 應用程式架構

JetNews 是為展示 Jetpack Compose 目前的 UI 功能而建構,其實作方式可支援不同的螢幕大小 (詳情請參閱這篇網誌文章)。

本程式碼研究室的目的並非深入探討 JetNews 應用程式架構。Gemini 整合作業大多會透過 GeminiRepositoryImpl 類別進行。

不過,如果您想瞭解按鈕如何觸發摘要功能,可以查看 JetnewsIcons.kt 中的 SummaryButton()。此外,您也可以查看 PostContent.ktSummarySection() 函式的摘要 UI 實作項目。

7. 結語

在本程式碼研究室中,您已瞭解如何進行以下作業:

  • 在 Google AI Studio 中建立及測試提示。
  • 在 Firebase 中設定專案,以便使用 Firebase AI Logic SDK。
  • 設定 Gradle 依附元件,在 Android 應用程式中使用 Firebase AI Logic。
  • 透過 Kotlin 程式碼呼叫 Gemini 2.5 Flash。

如要瞭解 Firebase AI Logic,請參閱 Android AI 程式碼範例說明文件