Integrasi AI ke aplikasi Android kamu sekarang lebih mudah dari sebelumnya. Google Gemini API punya free tier yang sangat generous, dan dokumentasi SDKnya sudah friendly untuk Kotlin. Dalam artikel ini, kita akan membuat chatbot AI yang fully functional — bukan hanya eksperimen.
Sebelum kita mulai, pastikan kamu sudah install Android Studio versi terbaru dan punya akun Google. Siap? Mari kita mulai.
Langkah 1: Setup Project Android dan Tambah Dependency
Buka Android Studio dan buat project baru dengan template Empty Activity. Pilih Kotlin sebagai language. Setelah project selesai di-generate, buka file build.gradle.kts di level app dan tambahkan dependency Gemini SDK.
dependencies {
// Gemini API
implementation("com.google.ai.client.generativeai:google-generative-ai-kotlin:0.1.1")
// Coroutines untuk async task
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1")
// Lifecycle untuk ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
implementation("androidx.activity:activity-ktx:1.7.2")
// RecyclerView
implementation("androidx.recyclerview:recyclerview:1.3.0")
// Material Design
implementation("com.google.android.material:material:1.9.0")
}
Setelah tambah dependency, klik "Sync Now" dan tunggu Gradle selesai download semua library.
Langkah 2: Dapatkan API Key dari Google AI Studio
Kunjungi aistudio.google.com (atau bisa langsung ke Google AI Studio). Login dengan akun Google kamu. Di dashboard, cari menu "Create new API key" atau "Get API key". Klik, dan Google akan generate API key gratis untuk kamu. Copy API key tersebut dan simpan di tempat aman — kita butuh di step berikutnya.
Penting: API key Gemini punya free tier yang generous — kamu bisa ngetes hingga 60 request per menit tanpa charge. Cocok banget untuk development dan eksperimen.
Langkah 3: Buat Data Class dan Repository
Sebelum nulis UI, kita setup backend logic dulu. Buat file baru bernama ChatMessage.kt:
data class ChatMessage(
val id: String = UUID.randomUUID().toString(),
val text: String,
val isUser: Boolean,
val timestamp: Long = System.currentTimeMillis()
)
Kemudian buat file GeminiRepository.kt yang handle komunikasi dengan Gemini API:
import com.google.ai.client.generativeai.GenerativeModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class GeminiRepository(apiKey: String) {
private val generativeModel = GenerativeModel(
modelName = "gemini-pro",
apiKey = apiKey
)
suspend fun sendMessage(prompt: String): String = withContext(Dispatchers.IO) {
val response = generativeModel.generateContent(prompt)
response.text ?: "Maaf, gagal mendapat response dari AI."
}
}
Langkah 4: Setup ViewModel dengan Coroutine
Buat file ChatViewModel.kt yang mengelola state chatbot:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
class ChatViewModel(private val repository: GeminiRepository) : ViewModel() {
private val _chatMessages = MutableStateFlow>(emptyList())
val chatMessages: StateFlow> = _chatMessages
private val _isLoading = MutableStateFlow(false)
val isLoading: StateFlow = _isLoading
fun sendMessage(userMessage: String) {
// Tambah pesan user ke UI
_chatMessages.value = _chatMessages.value + ChatMessage(
text = userMessage,
isUser = true
)
// Kirim ke AI secara async
viewModelScope.launch {
_isLoading.value = true
try {
val aiResponse = repository.sendMessage(userMessage)
_chatMessages.value = _chatMessages.value + ChatMessage(
text = aiResponse,
isUser = false
)
} catch (e: Exception) {
_chatMessages.value = _chatMessages.value + ChatMessage(
text = "Error: ${e.message}",
isUser = false
)
} finally {
_isLoading.value = false
}
}
}
}
Langkah 5: Buat UI dengan RecyclerView (Approach Klasik)
Jika kamu masih pakai RecyclerView, buat ChatAdapter.kt:
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
class ChatAdapter : RecyclerView.Adapter() {
private var messages = listOf()
fun submitList(newMessages: List) {
messages = newMessages
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatViewHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false) as TextView
return ChatViewHolder(itemView)
}
override fun onBindViewHolder(holder: ChatViewHolder, position: Int) {
val msg = messages[position]
holder.bind(msg)
}
override fun getItemCount() = messages.size
inner class ChatViewHolder(private val textView: TextView) : RecyclerView.ViewHolder(textView) {
fun bind(message: ChatMessage) {
val prefix = if (message.isUser) "You: " else "AI: "
textView.text = prefix + message.text
textView.setBackgroundColor(
if (message.isUser) android.graphics.Color.LTGRAY
else android.graphics.Color.WHITE
)
}
}
}
Buat layout XML activity_chat.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<RecyclerView
android:id="@+id/chatRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="16dp">
<EditText
android:id="@+id/messageInput"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Ketik pertanyaan..."
android:maxLines="1" />
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kirim" />
</LinearLayout>
</LinearLayout>
Terakhir, setup MainActivity.kt:
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import android.widget.EditText
import android.widget.Button
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: ChatViewModel
private lateinit var adapter: ChatAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)
// Ganti dengan API key kamu
val apiKey = "YOUR_API_KEY_HERE"
val repository = GeminiRepository(apiKey)
viewModel = ViewModelProvider(this, ChatViewModelFactory(repository))
.get(ChatViewModel::class.java)
// Setup RecyclerView
val recyclerView = findViewById(R.id.chatRecyclerView)
adapter = ChatAdapter()
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
// Observe chat messages
lifecycleScope.launch {
viewModel.chatMessages.collect { messages ->
adapter.submitList(messages)
recyclerView.scrollToPosition(messages.size - 1)
}
}
// Setup send button
val messageInput = findViewById(R.id.messageInput)
val sendButton = findViewById
Langkah 6: Tips Prompt Engineering Sederhana
Agar AI response kamu lebih fokus dan relevan, coba tambahkan context di prompt. Misalnya, jika chatbot kamu untuk tutorial programming, kamu bisa modify fungsi sendMessage di repository:
suspend fun sendMessage(prompt: String): String = withContext(Dispatchers.IO) {
val enhancedPrompt = """
Kamu adalah asisten programming yang helpful. Jawab pertanyaan user dengan ringkas dan kode jika perlu.
Pertanyaan: $prompt
""".trimIndent()
val response = generativeModel.generateContent(enhancedPrompt)
response.text ?: "Maaf, gagal mendapat response dari AI."
}
Ini disebut "system prompt" atau "context injection" — teknik sederhana tapi sangat berpengaruh untuk kualitas response AI.
Langkah 7: Keamanan API Key (Production)
JANGAN hardcode API key di MainActivity. Untuk production, simpan API key di local.properties atau gunakan backend server untuk proxy request. Tapi untuk development dan eksperimen, hardcoding untuk testing saja sudah oke.
Kesimpulan
Sekarang kamu sudah punya chatbot AI yang berfungsi di aplikasi Android native! Dengan Gemini API dan Kotlin, integrasi AI ke app mobile jadi sangat accessible. Free tier Google Gemini cukup generous untuk kamu eksperimen, build prototype, atau bahkan production app kecil-menengah. Dari sini, kamu bisa ekspansi — tambah database untuk history chat, implementasi stream response untuk real-time typing effect, atau bahkan voice input/output. Semua kode di atas sudah siap copy-paste. Jika ada error atau pertanyaan, cek dokumentasi resmi Gemini SDK di AI Studio. Happy coding!