Content Provider — adalah komponen Android yang menyediakan antarmuka terpadu untuk akses data antar aplikasi. Ia mengabstraksi penyimpanan fisik (SQLite, file, sumber jaringan) dan memastikan pertukaran informasi yang aman melalui ContentResolver. Menurut Android Developer Guide, 2026, Content Provider adalah salah satu dari empat komponen utama aplikasi Android bersama dengan Activity, Service, dan BroadcastReceiver. Tugasnya adalah membuat data tersedia bagi aplikasi lain dengan kontrol izin baca dan tulis.
Poin Utama
Content Provider — adalah komponen Android yang mengelola akses ke penyimpanan data terpusat dan menyediakannya kepada aplikasi lain melalui antarmuka kontrak terpadu. Ia menyembunyikan detail implementasi penyimpanan: data dapat disimpan di SQLite, sistem file, cloud, atau menjadi hasil permintaan jaringan.
Android menyertakan Content Provider bawaan untuk data sistem — ContactsContract, MediaStore, CalendarContract, CallLog. Aplikasi pihak ketiga juga dapat membuat penyedia mereka sendiri untuk pertukaran data yang aman. Setiap penyedia didaftarkan di AndroidManifest.xml dengan menentukan authority — string unik yang membentuk bagian pertama URI.
Content Provider bekerja berdasarkan model klien-server. Penyedia bertindak sebagai server yang mengimplementasikan enam metode wajib: query, insert, update, delete, getType, dan onCreate. Klien (aplikasi lain) mengakses penyedia melalui ContentResolver yang meneruskan panggilan ke metode penyedia yang sesuai melalui mekanisme IPC Android.
Setiap Content Provider diidentifikasi oleh URI skema content://. Misalnya, content://com.example.app.provider/items. Bagian pertama authority (com.example.app.provider) terikat ke kelas penyedia di manifes. Jalur /items menunjuk ke tabel, dan /items/5 — ke rekaman tertentu dengan ID=5.
Ketika aplikasi memanggil ContentResolver.query(URI), Android memeriksa izin paket pemanggil, menemukan penyedia berdasarkan authority, dan memulai prosesnya jika belum berjalan. Penyedia menjalankan kueri dan mengembalikan Cursor — objek yang berisi hasil dan memungkinkan klien untuk melakukan iterasi melalui rekaman.
Kelas ContentProvider memerlukan implementasi enam metode abstrak. Setiap metode menerima URI dan mengembalikan hasil yang sesuai dengan jenis operasi. Sistem memanggil metode ini dari proses mana pun, sehingga harus thread-safe dan tidak memblokir eksekusi untuk waktu yang lama.
Metode query menerima URI, array kolom projection, string selection dengan argumen, dan urutan pengurutan. Mengembalikan Cursor dengan data. Dalam implementasi, URI perlu diurai menggunakan UriMatcher dan menjalankan kueri SQL yang sesuai ke database.
Metode ini mengubah data di penyimpanan. insert menerima ContentValues — pasangan kunci-nilai — dan mengembalikan URI rekaman baru. update dan delete menerima selection untuk memfilter rekaman dan mengembalikan jumlah baris yang terpengaruh. Setelah mengubah data, penyedia harus memberi tahu melalui ContentResolver.notifyChange.
| Metode | Tujuan | Kembalian |
|---|---|---|
| query | Mendapatkan data berdasarkan URI | Cursor atau null |
| insert | Menambahkan rekaman baru | URI rekaman baru |
| update | Memperbarui rekaman yang ada | int (jumlah baris) |
| delete | Menghapus rekaman | int (jumlah baris) |
| getType | Tipe MIME untuk URI | String |
| onCreate | Inisialisasi penyedia | boolean |
ContentResolver — adalah titik akses tunggal untuk bekerja dengan semua Content Provider di sistem. Aplikasi klien tidak pernah memanggil metode penyedia secara langsung — hanya melalui ContentResolver, yang diperoleh Android dari konteks. Operasi CRUD di ContentResolver memiliki nama yang sama seperti di penyedia, tetapi menerima URI sebagai pengganti referensi langsung.
Untuk mengurai URI masuk di dalam penyedia, digunakan UriMatcher. Ini memungkinkan pencocokan URI dengan kode numerik — misalnya, URI content://authority/items menghasilkan kode 1, dan content://authority/items/# — kode 2. Ini menghilangkan kebutuhan penguraian manual string URI di setiap metode.
// Menggunakan ContentResolver untuk mengakses kontak
val uri = ContactsContract.Contacts.CONTENT_URI
val cursor = contentResolver.query(
uri,
arrayOf(ContactsContract.Contacts.DISPLAY_NAME),
null, null, null
)
cursor?.use {
while (it.moveToNext()) {
val name = it.getString(it.getColumnIndexOrThrow(
ContactsContract.Contacts.DISPLAY_NAME
))
Log.d("Kontak", "Nama: $name")
}
}
Cursor harus ditutup setelah digunakan — dalam contoh di atas, use (fungsi ekstensi Kotlin) melakukannya. Jika Cursor tidak ditutup, akan terjadi kebocoran memori karena ia memegang referensi ke data di kumpulan Binder. Untuk skenario UI, gunakan CursorLoader atau Room dengan LiveData/Flow.
Membuat Content Provider sendiri dimulai dengan mewarisi kelas ContentProvider. Penyedia bekerja dengan database SQLite melalui SQLiteOpenHelper dan menggunakan UriMatcher untuk menentukan jenis kueri. Mari kita lihat implementasi minimal untuk mengelola daftar catatan.
Penyedia didaftarkan di AndroidManifest.xml di dalam tag application. Atribut authorities menetapkan pengidentifikasi unik, dan exported menentukan apakah aplikasi lain dapat mengakses penyedia. Tanpa exported=true, penyedia hanya dapat diakses di dalam aplikasi Anda.
// Contoh Content Provider untuk catatan
class NotesProvider : ContentProvider() {
companion object {
const val AUTHORITY = "com.example.app.notes"
const val NOTES_PATH = "notes"
const val NOTES_URI = "content://$AUTHORITY/$NOTES_PATH"
const val NOTES_ID = "content://$AUTHORITY/$NOTES_PATH/#"
private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
addURI(AUTHORITY, NOTES_PATH, 1)
addURI(AUTHORITY, "$NOTES_PATH/#", 2)
}
}
override fun query(uri: Uri, projection: Array<String>?,
selection: String?, args: Array<String>?, sort: String?): Cursor? {
return when (uriMatcher.match(uri)) {
1 -> dbHelper.readableDatabase.query(TABLE_NOTES,
projection, selection, args, null, null, sort)
2 -> dbHelper.readableDatabase.query(TABLE_NOTES,
projection, "_id=?", arrayOf(uri.lastPathSegment), null, null, null)
else -> throw IllegalArgumentException("Unknown URI: $uri")
}
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
val id = dbHelper.writableDatabase.insert(TABLE_NOTES, null, values)
context?.contentResolver?.notifyChange(uri, null)
return ContentUris.withAppendedId(uri, id)
}
override fun delete(uri: Uri, selection: String?, args: Array<String>?): Int {
val count = dbHelper.writableDatabase.delete(TABLE_NOTES, selection, args)
context?.contentResolver?.notifyChange(uri, null)
return count
}
// getType, update, onCreate dihilangkan untuk singkatnya
}
Setelah membuat kelas, penyedia harus didaftarkan di manifes dengan atribut android:authorities dan android:exported (true jika penyedia bersifat publik). Sistem membuat instance penyedia pada akses pertama — ini terjadi di thread UI, sehingga onCreate harus dijalankan dengan cepat.
Content Provider memungkinkan pengelolaan akses ke data pada dua tingkat: izin baca dan izin tulis. Ini ditetapkan di manifes dengan atribut android:readPermission dan android:writePermission. Jika aplikasi klien tidak memiliki izin yang sesuai, sistem akan menolak panggilan dengan SecurityException.
Android mendukung izin sementara melalui flag FLAG_GRANT_READ_URI_PERMISSION dan FLAG_GRANT_WRITE_URI_PERMISSION. Ini berguna ketika aplikasi mengirimkan URI file ke aplikasi lain melalui Intent — penerima hanya mendapatkan akses ke URI tertentu untuk waktu terbatas. Sistem mencabut izin sementara setelah aplikasi penerima selesai.
Untuk penyedia sistem, Android memerlukan penetapan izin konkret di manifes aplikasi. Misalnya, untuk akses ke kontak diperlukan READ_CONTACTS, untuk kalender — READ_CALENDAR. Mulai Android 6, izin ini diminta saat runtime, bukan saat pemasangan.
Pertanyaan yang Sering Diajukan
Content Provider — adalah komponen Android yang menyediakan antarmuka standar untuk pertukaran data antar aplikasi melalui ContentResolver. Ia mengabstraksi metode penyimpanan (SQLite, file, jaringan) dan menyediakan akses aman ke data dengan kontrol izin baca dan tulis.
Authority — adalah string pengidentifikasi unik penyedia yang ditentukan di AndroidManifest.xml. Ini membentuk bagian pertama URI content://authority/path dan digunakan oleh sistem untuk merutekan panggilan ContentResolver ke penyedia yang tepat. Authority harus unik di antara semua aplikasi di perangkat.
UriMatcher mencocokkan URI dengan kode numerik. Anda menambahkan pola melalui addURI, lalu memanggil match untuk mendapatkan kode URI yang masuk. Ini memungkinkan dalam metode query, insert, update, delete untuk menentukan tabel atau rekaman mana yang diminta dan menjalankan operasi yang sesuai pada database.
Ya, Cursor harus ditutup setelah digunakan. Jika Cursor tidak ditutup, akan terjadi kebocoran memori karena ia memegang referensi Binder ke data penyedia. Di Kotlin, gunakan fungsi use untuk penutupan otomatis, dan di Java — try-with-resources atau panggilan cursor.close() di blok finally.
Content Provider — adalah komponen untuk akses data antar aplikasi, sementara SQLiteDatabase adalah penyimpanan internal satu aplikasi. Content Provider menyediakan antarmuka URI dan kontrol izin, sedangkan SQLiteDatabase bekerja langsung dengan database tanpa mekanisme keamanan di tingkat sistem operasi.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga