Cara yang lebih andal untuk menambahkan dan mengedit kontak di Android
Waktu baca: 6 menit
Yang berubah
Aplikasi yang menargetkan rilis Android mendatang tidak akan dapat lagi menulis langsung ke kontak dengan izin WRITE_CONTACTS. Sebagai gantinya, Anda dapat menggunakan intent kontak standar (ACTION_INSERT, ACTION_EDIT, dan ACTION_INSERT_OR_EDIT). Untuk mengetahui implementasi referensi lengkap, lihat panduan developer tentang cara mengubah kontak menggunakan intent.
Di perangkat yang menjalankan rilis Android mendatang, ketiga intent kontak ini akan berperilaku secara konsisten dan tidak memerlukan izin sama sekali. Jika aplikasi Anda menargetkan rilis Android mendatang atau yang lebih baru dan mencoba menulis ke kontak secara langsung, penulisan tersebut akan ditolak dan menghasilkan SecurityException atau penolakan izin. Untuk sejumlah kecil aplikasi yang memerlukan akses luas untuk membuat dan mengubah kontak, izin akses aplikasi khusus baru, MANAGE_CONTACTS, akan hadir di Android 17 QPR2 (Q4 2026). Google Play memublikasikan panduan terbaru untuk akses kontak, termasuk MANAGE_CONTACTS, hari ini.
Alasan kami melakukan perubahan ini
Saat ini, jika aplikasi Anda perlu menyimpan satu kontak saja, Anda mungkin meminta WRITE_CONTACTS. Namun, izin tersebut memberikan akses yang luas, sehingga aplikasi dapat membuat perubahan yang meluas pada kontak di seluruh perangkat di latar belakang, bahkan tanpa interaksi pengguna. Sebagian besar aplikasi tidak memerlukan izin yang luas.
Meskipun ada alternatif, kami telah menerima masukan dari Anda bahwa alternatif tersebut perlu lebih distandardisasi di seluruh ekosistem. Sebelumnya, intent kontak berperilaku berbeda dari satu perangkat ke perangkat lainnya. Beberapa editor menghapus data yang Anda teruskan, seperti foto kontak. Di beberapa perangkat, tombol kembali menyimpan kontak tanpa disengaja oleh pengguna atau opsi "buat kontak baru" sulit ditemukan. Jadi, meminta izin adalah pilihan yang rasional. Kami sedang memperbaiki semua masalah ini di versi Android mendatang dan mewajibkan perangkat yang menjalankannya untuk mengikuti standar yang sama.
Yang harus digunakan sebagai gantinya
Menambahkan atau mengedit kontak: menggunakan intent kontak
Saat Anda menggunakan intent ini - ACTION_INSERT, ACTION_EDIT, dan ACTION_INSERT_OR_EDIT - sistem akan menangani tugas berat dengan menampilkan pengalaman editor kontak yang rapi dan terstandardisasi. Tindakan ini akan membuka formulir setengah halaman cepat untuk entri baru, atau memungkinkan pengguna menelusuri dan menambahkan informasi ke kontak yang ada dengan mudah. Pengguna dapat dengan lancar memperluasnya menjadi editor halaman penuh untuk mengisi detail selengkapnya, semuanya tanpa perlu izin tulis langsung dari aplikasi Anda. Lihat tiruan UX tentatif di bawah:
Gambar 1: Membuat Kontak Baru *UX belum Final*
Gambar 2: Menambahkan Info ke Kontak yang Ada *UX Belum Final*
Catatan: Produsen perangkat yang berbeda dapat mengubah pengalaman pengguna agar sesuai dengan gaya OS mereka, tetapi perilakunya akan tetap konsisten.
Anda dapat lebih menyederhanakan proses pembuatan dengan meneruskan payload data opsional, yang dikenal sebagai Tambahan, bersama dengan intent Anda:
EXTRA_ACCOUNTmenyarankan akun tempat kontak disimpan, yang membantu jika aplikasi Anda menyinkronkan kontak. Fitur tambahan ini sudah ada, tetapi dukungannya bervariasi menurut perangkat. Mulai rilis Android mendatang, dukungan akan distandardisasi di seluruh perangkat.EXTRA_PHOTO_URImeneruskan foto untuk mengisi otomatis foto kontak. Editor akan menangani izin baca URI untuk Anda. Fitur ini baru tersedia di rilis Android mendatang dan akan didukung di seluruh ekosistem.
Sebelumnya: menulis langsung dengan
// Requires android.permission.WRITE_CONTACTS fun saveContactDirectly(context: Context, name: String, phone: String, account: Account) { val ops = arrayListOf( ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, account.name) .build(), ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE ) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name) .build(), ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE ) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) .build() ) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops) }
| Setelah: membuka editor kontak (Tidak memerlukan izin.)
fun saveContactWithEditor( context: Context, name: String, phone: String, account: Account, photoUri: Uri ) { val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI).apply { putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.PHONE, phone) // Suggest which account the contact is saved to putExtra(ContactsContract.Intents.Insert.EXTRA_ACCOUNT, account) // New in the upcoming Android release: pre-fill the contact photo putExtra(ContactsContract.Intents.Insert.EXTRA_PHOTO_URI, photoUri) clipData = ClipData.newRawUri("", photoUri) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } context.startActivity(intent) }
|
Sebelumnya: memperbarui kontak yang ada secara langsung
// Requires android.permission.WRITE_CONTACTS fun addPhoneDirectly(context: Context, rawContactId: Long, phone: String) { val values = ContentValues().apply { put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId) put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) } context.contentResolver.insert(ContactsContract.Data.CONTENT_URI, values) } | Setelah: mengizinkan pengguna memilih kontak untuk diperbarui, atau membuat kontak baru fun addPhoneWithEditor(context: Context, phone: String) { val intent = Intent(Intent.ACTION_INSERT_OR_EDIT).apply { type = ContactsContract.Contacts.CONTENT_ITEM_TYPE putExtra(ContactsContract.Intents.Insert.PHONE, phone) } context.startActivity(intent) } Jika Anda sudah tahu kontak mana yang akan diperbarui, gunakan fun editKnownContact(context: Context, contactUri: Uri, phone: String) { val intent = Intent(Intent.ACTION_EDIT, contactUri).apply { putExtra(ContactsContract.Intents.Insert.PHONE, phone) } context.startActivity(intent) }
|
Memilih kontak: menggunakan Pemilih Kontak
Jika Anda hanya perlu membaca kontak yang dipilih pengguna, gunakan Pemilih Kontak, yang tersedia sejak Android 17. Aplikasi ini tidak memerlukan izin.
Aplikasi panggilan telepon dan pesan: menggunakan Direktori Profil
Beberapa aplikasi menambahkan tindakan "Telepon dengan…" atau "Kirim pesan dengan…" ke kontak sehingga orang dapat memulai panggilan atau chat dari aplikasi Telepon atau Kontak. Jika aplikasi Anda melakukan hal ini sekarang dengan menulis entri tambahan ke kontak pengguna, pindah ke Direktori Orang, yang akan hadir di Android QPR2 (Q4 2026). Ini adalah direktori sistem baru tempat aplikasi Anda memublikasikan cara orang dapat saling menghubungi di aplikasi Anda, tanpa mengedit kontak pengguna.
Contoh cara aplikasi dapat bermigrasi
Untuk melihat cara kerja alternatif ini dalam praktiknya, berikut beberapa contoh cara berbagai jenis aplikasi dapat mengakses kontak:
| Contoh jenis aplikasi (tidak eksklusif). | Jalur migrasi yang direkomendasikan |
| Aplikasi Sosial, Pembayaran P2P, & Transportasi Online | Jika aplikasi Anda memungkinkan pengguna menemukan teman, membagi tagihan, atau membagikan status perjalanan, Anda tidak memerlukan izin kontak sama sekali. Gunakan Pemilih Kontak untuk pemilihan kontak satu kali, dan luncurkan ACTION_INSERT dengan EXTRA_PHOTO_URI saat pengguna mengetuk "Simpan ke Kontak" di profil. |
| Pemindai Kartu Nama & Aplikasi Jaringan Acara | Jika aplikasi Anda memindai badge atau kode QR dan menyimpan kontak baru – atau menambahkan nomor telepon kantor ke entri rekan kerja yang ada – gunakan ACTION_INSERT atau ACTION_INSERT_OR_EDIT. Editor setengah halaman standar akan mengisi otomatis kolom yang diuraikan (nama, perusahaan, telepon, email, dan foto) sehingga pengguna dapat memverifikasi dan menyimpan dalam sekali ketuk tanpa memberikan izin latar belakang. |
| Aplikasi Panggilan & Pesan VoIP | Daripada meminta WRITE_CONTACTS untuk memasukkan baris "Telepon dengan…" atau "Kirim pesan dengan…" kustom ke buku alamat pengguna, publikasikan metadata keterjangkauan melalui Direktori Orang dan gunakan ACTION_INSERT saat pengguna menambahkan kontak baru dari rangkaian pesan chat. |
| Aplikasi Sinkronisasi Cloud & CRM Perusahaan | Jika aplikasi Anda melakukan sinkronisasi kontak latar belakang dua arah yang berkelanjutan dengan akun cloud atau perusahaan – yang tidak memungkinkan untuk meminta pengguna dengan UI intent untuk setiap data – aplikasi Anda memenuhi syarat untuk mendeklarasikan MANAGE_CONTACTS |
Perubahan yang harus diperiksa
- Jenis data kustom tidak didukung di editor. Jika Anda meneruskan baris
Insert.DATAdengan jenis MIME selain jenisContactsContract.CommonDataKindsstandar, jenis MIME tersebut akan diabaikan secara otomatis oleh editor. SHOW_OR_CREATE_CONTACTtidak ditangani oleh editor sistem. Aplikasi kontak bawaan perangkat masih dapat menanganinya. Untuk perilaku yang konsisten di seluruh perangkat, gunakanACTION_INSERT_OR_EDIT.- Penulisan gagal secara default. Setelah Anda menargetkan rilis Android mendatang, penulisan langsung tanpa
MANAGE_CONTACTSakan menghasilkanSecurityException or permission denial. Uji keberadaannya.
Apakah saya memerlukan MANAGE_CONTACTS?
Mungkin tidak. Jika aplikasi Anda menyimpan atau mengedit kontak karena diminta oleh pengguna, intent di atas akan mencakup Anda, tanpa izin dan tanpa pernyataan Konsol Play.
MANAGE_CONTACTS ditujukan untuk aplikasi yang tujuan intinya adalah mengelola kontak, yang tidak cukup hanya menggunakan intent. Contoh:
| Aplikasi Anda… | Perlu MANAGE_CONTACTS? |
| Menyimpan kontak dari chat, kartu nama, atau pesanan. | Tidak, gunakan ACTION_INSERT |
| Menambahkan nomor atau email ke kontak yang ada. | Tidak, gunakan ACTION_INSERT_OR_EDIT atau ACTION_EDIT |
| Memungkinkan pengguna memilih kontak untuk diundang, diajak berbagi, atau dibayar. | Tidak, gunakan Pemilih Kontak |
| Menambahkan tindakan panggilan atau pesan ke kontak. | Tidak, gunakan Direktori Profil |
| Memiliki layar pengeditan kontak bermereknya sendiri. | Tidak, antarmuka kustom saja tidak memenuhi syarat |
| Merupakan aplikasi pengelola kontak atau pengganti telepon khusus. | Kemungkinan ya |
| Merupakan aplikasi ID penelepon & perlindungan dari spam yang memperbarui entri buku alamat secara massal. | Kemungkinan ya |
| Menyinkronkan kontak dengan akun perusahaan atau cloud di latar belakang. | Kemungkinan ya |
| Melakukan pencadangan/pemulihan kontak massal atau transfer ponsel dari perangkat ke perangkat. | Kemungkinan ya |
| Menyetel nada dering kustom untuk setiap kontak. | Kemungkinan ya |
Cara kerjanya:
MANAGE_CONTACTSadalah izin akses aplikasi khusus. Dialog ini bukan dialog runtime. Pengguna dapat mengaktifkannya di Setelan > Akses aplikasi khusus > Kelola kontak.
// Opens Settings > Apps > Special app access > Manage contacts val intent = Intent(Settings.ACTION_MANAGE_CONTACTS, Uri.fromParts("package", packageName, null)) context.startActivity(intent)
- Cakupan ini meliputi membaca, menambahkan, mengedit, dan menghapus kontak, akun, dan data Direktori Profil. Anda juga tidak perlu meminta
READ_CONTACTS. - Untuk memublikasikan aplikasi di Google Play dengan
MANAGE_CONTACTS, Anda harus mengirimkan pernyataan di Konsol Play yang menjelaskan alasan intent tidak cukup untuk fungsi inti aplikasi Anda.
Langkah-langkah migrasi
- Temukan penulisan kontak Anda. Telusuri kode Anda untuk menemukan
WRITE_CONTACTS,ContactsContract.RawContacts.CONTENT_URI,ContactsContract.Data.CONTENT_URI, danapplyBatch(ContactsContract.AUTHORITY, …). - Ganti setiap penulisan yang didorong pengguna dengan intent:
ACTION_INSERTuntuk kontak baru, danACTION_EDITatauACTION_INSERT_OR_EDITuntuk update. - Hanya gunakan jenis data standar di
Insert.DATA. Memindahkan tindakan panggilan atau pesan ke Direktori Orang. - Tentukan apakah Anda benar-benar memerlukan
MANAGE_CONTACTSmenggunakan tabel di atas. Jika ya, rencanakan pernyataan Konsol Play Anda. - Hapus
WRITE_CONTACTSdari manifes Anda setelah tidak ada alur kode yang memerlukannya.
Linimasa
| Jika | Yang terjadi |
| 21 Oktober 2026 | Google Play mengumumkan kebijakan MANAGE_CONTACTS |
| 2026 (Android 17 Quarterly Platform Release 2) | Izin MANAGE_CONTACTS tersedia |
| 2027 (Rilis Android mendatang) | WRITE_CONTACTS tidak lagi memberikan akses tulis ke aplikasi yang menargetkan rilis Android mendatang. Intent kontak distandardisasi di seluruh perangkat |
| 2027, tidak lebih awal dari rilis Android mendatang | Konsol Play meminta aplikasi yang menggunakan MANAGE_CONTACTS untuk mengirimkan pernyataan |
| 2027, tidak lebih awal dari rilis Android mendatang | Kepatuhan terhadap kebijakan Play diperlukan |
FAQ
- Apakah hal ini memengaruhi setiap aplikasi?
- Perubahan penghentian penggunaan
WRITE_CONTACTShanya berlaku untuk aplikasi yang menargetkan rilis Android mendatang dan setelahnya. Aplikasi yang menargetkan versi lama akan mempertahankan perilakunya saat ini, tetapi editor kontak standar yang baru akan tersedia untuk semua aplikasi yang berjalan di OS baru, terlepas dari SDK targetnya.
- Perubahan penghentian penggunaan
- Dapatkah aplikasi saya menghapus kontak dengan intent?
- Tidak. Tidak ada intent untuk menghapus kontak. Pengguna menghapus kontak di aplikasi kontak mereka. Aplikasi dengan
MANAGE_CONTACTSdapat menghapus kontak secara langsung.
- Tidak. Tidak ada intent untuk menghapus kontak. Pengguna menghapus kontak di aplikasi kontak mereka. Aplikasi dengan
- Saya sudah memiliki layar pengeditan kontak sendiri. Dapatkah saya menyimpannya?
- Hanya jika aplikasi Anda memenuhi syarat untuk
MANAGE_CONTACTS. Keinginan untuk mempertahankan desain kustom bukanlah alasan yang memenuhi syarat.
- Hanya jika aplikasi Anda memenuhi syarat untuk
- Apakah
MANAGE_CONTACTSmenggantikan READ_CONTACTS?MANAGE_CONTACTSmencakup akses baca sehingga Anda tidak perlu meminta keduanya, tetapi banyak aplikasi yang memenuhi syarat untukREAD_CONTACTSyang tidak perlu mengubah kontak sama sekali. Aplikasi ini dapat terus memintaREAD_CONTACTS.
- Bagaimana dengan pengguna saya yang menggunakan versi Android lama?
- Intent kontak juga berfungsi pada versi lama, yang ditangani oleh aplikasi kontak perangkat. Sebagian besar aplikasi akan berfungsi dengan baik di semua perangkat menggunakan intent ini. Jika aplikasi Anda terpengaruh oleh masalah konsistensi tertentu yang hanya diselesaikan dalam versi terbaru, Anda dapat mempertahankan izin
WRITE_CONTACTSdalam manifes yang dicakup dengan maxSdkVersion yang sesuai.
- Intent kontak juga berfungsi pada versi lama, yang ditangani oleh aplikasi kontak perangkat. Sebagian besar aplikasi akan berfungsi dengan baik di semua perangkat menggunakan intent ini. Jika aplikasi Anda terpengaruh oleh masalah konsistensi tertentu yang hanya diselesaikan dalam versi terbaru, Anda dapat mempertahankan izin
-
Berita ProdukDi Google I/O 2026, kami memperkenalkan peralihan Android dari sistem operasi ke sistem kecerdasan. Kami juga menunjukkan cara membangun pengalaman cerdas secara native dengan sistem dan menghadirkan kecanggihan AI Google ke dalam aplikasi Anda.
Jingyu Shi • Waktu baca: 2 menit -
Berita ProdukTahun ini di Google I/O, kami melangkah lebih jauh dari perubahan berulang, menuju perubahan mendasar dalam cara aplikasi dibuat. Alat terbaru kami dibuat untuk era agentic dengan fitur yang meningkatkan produktivitas Anda sebagai developer Android DAN memaksimalkan agen AI yang Anda deploy di codebase.
Matthew Warner • Waktu baca: 8 menit -
Berita ProdukDiumumkan hari ini selama The Android Show, Android bertransisi dari sistem operasi ke sistem kecerdasan, sehingga menciptakan lebih banyak peluang untuk interaksi dengan aplikasi Anda.
Matthew McCullough • Waktu baca: 4 menit
Dapatkan insight pengembangan Android terbaru yang dikirim ke kotak masuk Anda setiap minggu.