Bentornato alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e basata su agenti. Nel post precedente abbiamo presentato Jetpacker, l'app demo che utilizzeremo in questa serie.
In questo post del blog, ti mostreremo come utilizzare Gemini Nano tramite l'API Prompt di ML Kit per creare funzionalità intelligenti sul dispositivo.
La creazione di funzionalità intelligenti sul dispositivo si riferisce alla possibilità di elaborare prompt e dati direttamente su un dispositivo senza inviare dati a un server. Questo approccio offre alcuni vantaggi:
- I dati utente possono essere elaborati localmente sul dispositivo, preservando la privacy dell'utente
- La funzionalità del modello è affidabile anche con una connessione a internet instabile o assente.
- Nessun costo aggiuntivo per l'inferenza sul cloud, poiché tutto viene eseguito sull'hardware dell'utente
Tenendo presente i vantaggi dell'elaborazione on-device, abbiamo identificato tre funzionalità da aggiungere a Jetpacker che possono migliorare l'esperienza utente: riepilogo degli itinerari di viaggio, gestione delle spese e acquisizione di note vocali.
Riassunto personalizzato di alta qualità di testi brevi
La schermata dell'itinerario offre agli utenti una rapida panoramica di tutte le attività per un determinato viaggio. Poiché questa schermata contiene molte informazioni, può diventare rapidamente difficile da gestire. Per aiutare gli utenti a prepararsi senza sentirsi sopraffatti, possiamo aggiungere una sezione "Preparati per il tuo viaggio" in alto.
Inserendo un itinerario di viaggio e chiedendo a un LLM di riassumerlo, possiamo generare un rapido riepilogo del viaggio insieme a consigli su cosa mettere in valigia e frasi locali utili. Questo è un ottimo caso d'uso per un modello sul dispositivo per diversi motivi:
- Rendimento e qualità:sia il testo di input che quello di output sono relativamente brevi. In questo modo, possiamo aspettarci che le prestazioni e la qualità di una soluzione sul dispositivo siano alla pari con i modelli cloud più potenti.
- Scalabilità:lo spostamento dell'inferenza sul dispositivo ci consente di scalare questa funzionalità da pochi utenti a milioni senza preoccuparci di gestire i costi crescenti dell'inferenza sul cloud.
- Bassa latenza e affidabilità: l'inferenza sul dispositivo garantisce una bassa latenza, offrendo un'esperienza affidabile anche quando gli utenti sono offline.
Per creare con l'AI on-device, utilizziamo Gemini Nano, il modello di Google più efficiente ottimizzato per i dispositivi mobili. Gemini Nano è stato introdotto per la prima volta alcuni anni fa e ora è in esecuzione su oltre 140 milioni di dispositivi. L'ultima versione del modello, Gemini Nano 4, si basa sull'architettura del modello Gemma 4 rilasciato di recente ed è ulteriormente ottimizzata per la massima efficienza della batteria e delle prestazioni.
Utilizzando l' API Prompt di ML Kit, possiamo sfruttare le nuove funzionalità del modello di Gemini Nano 4 per prototipare le nostre funzionalità on-device. Creeremo un prompt che includa l'itinerario di un viaggio e chiederemo al modello di generare un riepilogo insieme a eventuali suggerimenti per la preparazione.
Trovare il prompt ottimale di solito richiede alcune iterazioni e l'app AICore è perfetta per questo passaggio della procedura. Dopo aver attivato l'opzione di anteprima per gli sviluppatori per AICore, possiamo scaricare modelli di anteprima come Gemini Nano 4 per testare i prompt e vedere gli output previsti del modello. Con alcune iterazioni sul prompt, siamo riusciti a migliorare la velocità della risposta da 13 secondi a meno di 2 secondi. Dai un'occhiata all'implementazione del codice finale e al prompt qui.
[ASSET HERE - FILE TOO LARGE ATM]
Elaborazione locale per l'input utente sensibile
In seguito, per aiutare gli utenti a godersi ancora di più il viaggio, creeremo un semplice gestore delle spese che eliminerà il lavoro manuale di smistamento delle ricevute e calcolo dei budget.
Poiché le ricevute potrebbero contenere informazioni sensibili come il numero di carta di credito e gli indirizzi, questo è un altro ottimo caso d'uso per una soluzione sul dispositivo. Con l'elaborazione sul dispositivo, gli utenti possono avere la certezza che le informazioni private verranno elaborate localmente sul dispositivo senza che i loro dati vengano inviati al cloud.
Inoltre, Gemini Nano 4 ha migliorato le funzionalità del modello per la multimodalità, in particolare per le attività di comprensione delle immagini come l'OCR e l'estrazione di dati visivi, il che lo rende un'ottima soluzione per attività come l'estrazione di informazioni dalle ricevute.
Per questo caso d'uso, il prompt analizzerà un'immagine della ricevuta e restituirà informazioni quali: un titolo generato, l'importo speso e la categoria della spesa. Per garantire che il modello restituisca le informazioni nel formato preferito, possiamo utilizzare l'API Structured Output di ML Kit per restituire senza problemi un oggetto dati Kotlin che definiamo.
// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// ksp("com.google.mlkit:genai-schema-compiler:1.0.0-alpha1")
@Generable("Information extracted from an expense receipt")
data class ParsedReceipt(
@Guide("Generated title for the expense less than 6 words. Based on restaurant or activity name.")
val title: String,
@Guide("Total amount of the expense. Look for values at the bottom and words like total or balance due.")
val amount: Double,
@Guide("Type of expense", enumValues = ["travel", "food", "shopping", "entertainment", "other"])
val category: String,
)
val prompt = "Determine if the image is a receipt or expense.
If it is NOT a receipt or expense, output the text 'NOT_A_RECEIPT'.
Otherwise, parse the receipt information."
val request = generateContentRequest(ImagePart(bitmap), TextPart(prompt)) {}
val requestWithStructuredOutput = generateTypedContentRequest(request, ParsedReceipt::class)
// Define the configuration for Gemini Nano 4 E4B preview model
// When selecting models, you can specify which performance charactertists are most important
// for your use case. Use ModelPreference.FULL when you want to prioritize reasoning power over speed.
// Use ModelPreference.FAST when complex logic is not required and latency is a priority.
val previewFullConfig = generationConfig {
modelConfig = modelConfig {
releaseStage = ModelReleaseStage.PREVIEW
preference = ModelPreference.FULL
}
}
val geminiNano4BPreviewModel = Generation.getClient(previewFullConfig)
val response = geminiNano4BPreviewModel.generateContent(requestWithStructuredOutput)
val parsedReceipt: ParsedReceipt? = response.candidates.firstOrNull()?.responseInput multimodale
Infine, per aiutare gli utenti a registrare memo audio durante il viaggio, creiamo una funzionalità di note vocali completamente sul dispositivo. Utilizzando l'API Speech Recognition di ML Kit, consentiremo agli utenti di registrare brevi note vocali che vengono trascritte automaticamente in testo. Con il testo trascritto, utilizzeremo l'API Prompt di ML Kit per identificare l'attività del viaggio associata alla nota vocale registrata, consentendo agli utenti di riepilogare facilmente il viaggio mentre scorrono l'itinerario.
L'API ML Kit GenAI Speech Recognition consente di trascrivere i contenuti audio in testo completamente sul dispositivo utilizzando due modalità distinte. La modalità di base utilizza un modello di riconoscimento vocale tradizionale sul dispositivo ed è disponibile sulla maggior parte dei dispositivi Android con livello API 31 e versioni successive. La modalità avanzata utilizza Gemini Nano per offrire una copertura linguistica più ampia e una qualità migliore ed è attualmente supportata sui dispositivi Pixel 10.
Per la nostra funzionalità, combiniamo l'API Speech Recognition con l'API ML Kit GenAI Prompt:
// implementation("com.google.mlkit:genai-prompt:1.0.0-beta3")
// implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")
val tripEvents = ...
// Set up speech recognition
val speechRecognizerOptions =
speechRecognizerOptions {
locale = Locale.US
preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
}
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(speechRecognizerOptions)
suspend fun transcribeVoiceNote(recognizer: SpeechRecognizer) {
// Display partial text as the user is recording audio
var partialTextResponse = ""
// Display the full text once user is finished recording audio
var transcription = ""
val request: SpeechRecognizerRequest
= speechRecognizerRequest { audioSource = AudioSource.fromMic() }
recognizer.startRecognition(request).collect { response ->
when (response) {
is SpeechRecognizerResponse.PartialTextResponse -> {
partialTextResponse = response.text
}
is SpeechRecognizerResponse.FinalTextResponse -> {
transcription = response.text
processAndCategorizeVoiceNote(transcription, tripEvents)
}
}
}
}
fun processAndCategorizeVoiceNote(transcribedVoiceNote: String, events: List<Event>) {
val prompt = "Given the voice note $transcribedVoiceNote
and the following events for this trip: $events, rewrite this transcription
to remove filler words. Then, identify which events from the
list this rewritten transcription matches to."
// Utilize ML Kit's Prompt API to process voice note and tag it with the relevant trip activities
Generation.getClient().generateContent(prompt)
}Conclusione
Utilizzando le API GenAI di ML Kit, abbiamo potuto sfruttare Gemini Nano per sviluppare funzionalità intelligenti completamente sul dispositivo per l'app JetPacker e fornire un'esperienza utente migliorata senza costi cloud aggiuntivi.
Dai un'occhiata al codice sorgente completo di Jetpacker su GitHub e guarda il video Build Intelligent Android apps with Google’s AI per scoprire di più su come integrare funzionalità intelligenti direttamente nella tua app utilizzando modelli on-device, ragionamento basato sul cloud e i framework agentici più recenti.
Scopri di più
Dai un'occhiata alle altre parti di questa serie di post del blog:
Parte 1: introduzione dell'app e una panoramica generale.
Parte 2 (questo post): Intelligence on-device. Esplora in dettaglio le API AI generativa di ML Kit e Gemini Nano per creare funzionalità incentrate sulla privacy, come il riepilogo dell'itinerario, l'analisi delle ricevute e l'elaborazione audio locale.
Parte 3: ragionamento ibrido e sul cloud. Scopri come utilizzare Firebase AI Logic per basare le risposte degli LLM su dati reali come Google Maps e il contesto web.
Parte 4: integrazione del sistema. Integrazione con il sistema di intelligence Android tramite AppFunctions.
Parte 5 (disponibile a breve): workflow agentici in-app. Estendi l'app con un assistente per le prenotazioni end-to-end basato su A2UI e ADK.
Ti interessa saperne di più sullo sviluppo per Android? Segui Android Developers su YouTube o LinkedIn.
Tutti gli snippet di codice in questo post del blog seguono la seguente nota sul copyright:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
IstruzioniBentornato alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e basata su agenti.
Thomas Ezan, Jolanda Verhoef, Caren Chang • Lettura di 8 minuti -
IstruzioniJetpacker è un'app di dimostrazione tecnica che il nostro team ha creato da zero per il Google I/O di quest'anno (utilizzando Antigravity). Nella sua essenza, Jetpacker aiuta gli utenti a pianificare, esplorare e godersi la loro prossima grande avventura.
Jolanda Verhoef • Lettura di 4 minuti -
IstruzioniBentornato alla serie di post del blog "Crea app per Android intelligenti", in cui prendiamo un'app per Android di base e la trasformiamo in un'esperienza personalizzata, intelligente e basata su agenti. Nel post precedente, abbiamo esplorato come utilizzare Firebase AI Logic per creare funzionalità di AI ibrida e ospitata sul cloud.
Ben Weiss • Lettura di 6 minuti
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.