Ürün Haberleri

Android'de kişi eklemenin ve düzenlemenin daha güvenilir bir yolu

Okuma süresi: 6 dk.
Roxanna Aliabadi Walker'ın profilini görüntüle
Roxanna Aliabadi Walker Ürün Müdürü, Android

Neler değişecek?

Yakında çıkacak Android sürümünü hedefleyen uygulamalar, WRITE_CONTACTS izniyle kişilere doğrudan yazamayacak. Bunun yerine standart kişi intent'lerini (ACTION_INSERT, ACTION_EDIT ve ACTION_INSERT_OR_EDIT) kullanabilirsiniz. Tam bir referans uygulama için intent'leri kullanarak kişileri değiştirme ile ilgili geliştirici kılavuzuna bakın. 

Yakında çıkacak Android sürümünü çalıştıran cihazlarda bu üç kişi amacı tutarlı bir şekilde davranır ve hiçbir izin gerektirmez. Uygulamanız, yakında çıkacak Android sürümünü veya sonraki sürümleri hedefliyorsa ve doğrudan kişilere yazmaya çalışırsa bu yazma işlemleri reddedilir ve SecurityException ya da izin reddiyle sonuçlanır. Kişi oluşturmak ve değiştirmek için geniş erişim gerektiren az sayıdaki uygulama için Android 17 QPR2'de (2026'nın 4. çeyreği) yeni bir özel uygulama erişim izni (MANAGE_CONTACTS) kullanıma sunulacak. Google Play, bugün MANAGE_CONTACTS dahil olmak üzere kişilere erişimle ilgili güncellenmiş yönergeleri yayınlıyor.

Bu değişikliği neden yapıyoruz?

Şu anda uygulamanızın tek bir kişiyi bile kaydetmesi gerekiyorsa WRITE_CONTACTS iznini istiyor olabilirsiniz. Ancak bu izin, geniş kapsamlı erişim sağlayarak bir uygulamanın, kullanıcı etkileşimi olmadan bile arka planda cihazdaki kişilerde kapsamlı değişiklikler yapmasına olanak tanır. Çoğu uygulamanın bu kadar geniş bir izne ihtiyacı yoktur.

Alternatifler olsa da sizden aldığımız geri bildirimler, bu alternatiflerin ekosistem genelinde daha standart hale getirilmesi gerektiğini gösteriyor. Daha önce, kişi amaçları cihazdan cihaza farklı şekilde davranıyordu. Bazı düzenleyiciler, ilettiğiniz verileri (ör. kişi fotoğrafı) sildi. Bazı cihazlarda geri düğmesi, kullanıcının niyeti olmadan kişiyi kaydetti veya "yeni kişi oluştur" seçeneğini bulmak zordu. Bu nedenle izin istemek mantıklı bir seçimdi. Yakında çıkacak Android sürümünde tüm bu sorunları düzeltiyoruz ve bu sürümü çalıştıran cihazların aynı standartlara uymasını zorunlu kılıyoruz.

Bunun yerine ne kullanılmalı?

Kişi ekleme veya düzenleme: Kişi intent'lerini kullanma

ACTION_INSERT, ACTION_EDIT ve ACTION_INSERT_OR_EDIT intent'lerini kullandığınızda sistem, temiz ve standartlaştırılmış bir kişi düzenleyici deneyimi sunarak zorlu işleri halleder. Yeni girişler için hızlı bir yarım sayfa form açar veya kullanıcının mevcut bir kişiyi kolayca arayıp bilgi eklemesine olanak tanır. Kullanıcılar, uygulamanızın doğrudan yazma iznine ihtiyaç duymadan daha fazla ayrıntı girmek için bu düzenleyiciyi tam sayfa düzenleyiciye sorunsuz bir şekilde genişletebilir. Aşağıdaki geçici UX maketlerini inceleyin: 

Figure01_01_Quick_Insert_Half_Sheet_Prefilled.png
Ekran görüntüsü 2 - Başlık: Yeni Kişi Oluşturma İşleminin Tam Sayfa Modeli: Avatar seçici, ad, telefon ve e-posta alanlarını içeren tam ekran kişi düzenleyiciyi gösteren geçici bir Android kullanıcı arayüzünün ekran görüntüsü. Tasarım, "Nihai kullanıcı deneyimi değildir" olarak etiketlenmiştir.

Şekil 1: Yeni Kişi Oluşturma  *Kullanıcı deneyimi nihai değildir*

Figure02_01_Add_To_Existing_0_Search_State_Half_Sheet.png
Ekran görüntüsü 2 - Başlık: "Mevcut Bir Kişiye Bilgi Ekleme"nin Tam Sayfa Taslağı: Avatar seçici, ad, telefon ve e-posta alanlarını içeren tam ekran kişi düzenleyiciyi gösteren geçici bir Android kullanıcı arayüzünün ekran görüntüsü. Tam sayfa tasarımda, ikincil alanlar için kademeli açıklama çipleri bulunur. Tasarım, "UX not Final" (Nihai kullanıcı deneyimi değildir) olarak etiketlenmiştir.

Şekil 2: Mevcut bir kişiye bilgi ekleme *UX nihai değildir*


Not: Farklı cihaz üreticileri, kullanıcı deneyimini kendi işletim sistemi stillerine uyacak şekilde değiştirebilir ancak davranış tutarlı kalır.


Intent'inizle birlikte Ekstralar olarak bilinen isteğe bağlı veri yüklerini ileterek oluşturma sürecini daha da kolaylaştırabilirsiniz:

  • EXTRA_ACCOUNT, kişinin hangi hesaba kaydedileceğini önerir. Bu, uygulamanız kişileri senkronize ediyorsa faydalı olur. Bu ek özellik daha önce de vardı ancak desteklenen cihazlar farklılık gösteriyordu. Yakında çıkacak Android sürümünden itibaren destek, cihazlar genelinde standartlaştırılacak.
  • EXTRA_PHOTO_URI, kişi resmini önceden doldurmak için bir fotoğraf gönderir. Düzenleyici, URI okuma iznini sizin için yönetir. Bu, yakında çıkacak Android sürümüyle birlikte sunulan yeni bir özelliktir ve ekosistem genelinde desteklenecektir.

Önce: Doğrudan WRITE_CONTACTS ile yazma (Uygulamanız yakında çıkacak Android sürümünü hedeflediğinde SecurityException veya izin reddi ile sonuçlanır.)

 

// 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)
}

 

 

Sonra: Kişi düzenleyiciyi açma (İzin gerekmez.)

 

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)
}

 

Önceki yöntem: Mevcut bir kişiyi doğrudan güncelleme

 

// 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)
}

Sonra: Kullanıcının güncellenecek bir kişi seçmesine veya yeni bir kişi oluşturmasına izin verme

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)
}

Güncellenecek kişiyi zaten biliyorsanız ilgili kişinin URI'siyle ACTION_EDIT yöntemini kullanın:

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)
}

 

Kişi seçme: Kişi Seçici'yi kullanma

Yalnızca kullanıcının seçtiği kişileri okumanız gerekiyorsa Android 17'den itibaren kullanılabilen Kişi Seçici'yi kullanın. İzin gerekmez.

Arama ve mesajlaşma uygulamaları: Kişi Dizini'ni kullanma

Bazı uygulamalar, kişilere "Şununla ara..." veya "Şununla mesaj gönder..." işlemlerini ekler. Böylece kullanıcılar Telefon veya Kişiler uygulamasından arama ya da sohbet başlatabilir. Uygulamanız şu anda kullanıcının kişilerine ek girişler yazarak bunu yapıyorsa Android QPR2'de (2026'nın 4. çeyreği) kullanıma sunulacak olan Kişiler Dizini'ne geçin. Uygulamanızın, kullanıcıların birbirleriyle nasıl iletişim kurabileceğini yayınladığı yeni bir sistem dizinidir. Bu dizin, kullanıcının kişilerini düzenlemez.

Uygulamaların nasıl taşınabileceğine dair örnekler

Bu alternatiflerin uygulamada nasıl çalıştığını görmek için farklı uygulama türlerinin kişi erişimine nasıl yaklaşabileceğine dair birkaç örneği aşağıda bulabilirsiniz:

Örnek uygulama türü (kapsamlı değildir).Önerilen taşıma yolu
Sosyal, P2P Ödeme ve Araç Paylaşımı UygulamalarıUygulamanız kullanıcıların arkadaş bulmasına, hesabı bölüşmesine veya gezi durumunu paylaşmasına olanak tanıyorsa kişi izinlerine hiç ihtiyacınız yoktur. Tek seferlik kişi seçimi için Kişi Seçici'yi kullanın ve kullanıcı bir profilde "Kişilere kaydet"e dokunduğunda ACTION_INSERT ile EXTRA_PHOTO_URI uygulamasını başlatın.
Kartvizit Tarayıcılar ve Etkinlik Ağ UygulamalarıUygulamanız bir yaka kartını veya QR kodunu tarayıp yeni bir kişi kaydediyorsa ya da mevcut bir iş arkadaşının girişine iş telefonu numarası ekliyorsa ACTION_INSERT veya ACTION_INSERT_OR_EDIT kullanın. Standartlaştırılmış yarım sayfa düzenleyici, ayrıştırılmış alanları (ad, şirket, telefon, e-posta ve fotoğraf) önceden doldurur. Böylece kullanıcı, arka plan izinleri vermeden tek dokunuşla bilgileri doğrulayıp kaydedebilir.
VoIP üzerinden arama ve mesajlaşma uygulamalarıKullanıcının adres defterine özel "Şununla ara..." veya "Şununla mesaj gönder..." satırları eklemek için WRITE_CONTACTS kullanmak yerine, erişilebilirlik meta verilerini Kişiler Dizini üzerinden yayınlayın ve kullanıcılar bir sohbet ileti dizisinden yeni kişi eklediğinde ACTION_INSERT kullanın.
Kurumsal CRM ve Bulut Senkronizasyon UygulamalarıUygulamanız bir bulut veya kurumsal hesapla sürekli, iki yönlü arka planda kişi senkronizasyonu gerçekleştiriyorsa (her kayıt için kullanıcıya bir intent kullanıcı arayüzü göstermek mümkün değilse) uygulamanız MANAGE_CONTACTS  beyanında bulunmaya uygundur.

Kontrol edilecek değişiklikler

  • Özel veri türleri düzenleyicide desteklenmez. Standart ContactsContract.CommonDataKinds türleri dışındaki MIME türlerine sahip Insert.DATA satırları iletirseniz bu MIME türleri, düzenleyici tarafından sessizce yoksayılır.
  • SHOW_OR_CREATE_CONTACT , sistem düzenleyicisi tarafından işlenmiyor. Cihazla birlikte gelen Kişiler uygulamaları bu işlemi gerçekleştirmeye devam edebilir. Cihazlar arasında tutarlı bir davranış için ACTION_INSERT_OR_EDIT kullanın.
  • Yazma işlemleri varsayılan olarak başarısız olur. Yaklaşan Android sürümünü hedeflediğinizde, MANAGE_CONTACTS olmadan yapılan tüm doğrudan yazma işlemleri SecurityException or permission denial ile sonuçlanır. Test edin.

MANAGE_CONTACTS'a ihtiyacım var mı?

Muhtemelen karşılaşmazsınız. Uygulamanız, kullanıcının isteği üzerine kişileri kaydediyor veya düzenliyorsa yukarıdaki intent'ler, izin ve Google Play Console beyanı olmadan sizi kapsar.

MANAGE_CONTACTS, temel amacı kişileri yönetmek olan ve intent'lerin yeterli olmadığı uygulamalar içindir. Örneğin:

Uygulamanız…MANAGE_CONTACTS mi gerekiyor?
Sohbet, kartvizit veya siparişten bir kişiyi kaydeder.Hayır, ACTION_INSERT kullan
Mevcut bir kişiye numara veya e-posta ekler.Hayır, ACTION_INSERT_OR_EDIT veya ACTION_EDIT kullanın
Kullanıcıların davet edecekleri, paylaşımda bulunacakları veya ödeme yapacakları kişileri seçmelerine olanak tanır.Hayır,Kişi Seçici'yi kullanın.
Kişilere arama veya mesaj işlemleri ekler.Hayır, Kişi Dizini'ni kullan
Kendi markalı kişi düzenleme ekranı vardır.Hayır,özel bir arayüz tek başına yeterli değildir.
Özel bir kişi yöneticisi veya numara çevirici değiştirme uygulamasıdır.Büyük olasılıkla evet
Adres defteri girişlerini toplu olarak güncelleyen bir arayan kimliği ve spam koruması uygulamasıdır.Büyük ihtimalle evet
Kişileri arka planda bir kurumsal hesap veya bulut hesabıyla senkronize eder.Büyük ihtimalle evet
Toplu kişi yedekleme/geri yükleme veya cihazdan cihaza telefon aktarımı gerçekleştirir.Büyük ihtimalle evet
Kişiler için özel zil sesleri ayarlar.Büyük ihtimalle evet

İşleyiş şekli:

  • MANAGE_CONTACTS, özel bir uygulama erişim iznidir. Çalışma zamanı iletişim kutusu değildir. Kullanıcılar bu ayarı Ayarlar > Özel uygulama erişimi > Kişileri yönet bölümünden etkinleştirir.
// Opens Settings > Apps > Special app access > Manage contacts
val intent = Intent(Settings.ACTION_MANAGE_CONTACTS, Uri.fromParts("package", packageName, null))
context.startActivity(intent)
  • Kişileri, hesapları ve Kişiler Dizini verilerini okuma, ekleme, düzenleme ve silme işlemlerini kapsar. READ_CONTACTS için de istekte bulunmanız gerekmez.
  • MANAGE_CONTACTS ile Google Play'de yayınlamak için Play Console'da, intent'lerin uygulamanızın temel işlevi için neden yeterli olmadığını açıklayan bir beyan gönderirsiniz.

Taşıma adımları

  • Kişi yazma işlemlerinizi bulma Kodunuzda WRITE_CONTACTS, ContactsContract.RawContacts.CONTENT_URI, ContactsContract.Data.CONTENT_URI ve applyBatch(ContactsContract.AUTHORITY, …) ifadelerini arayın.
  • Kullanıcı tarafından yapılan her yazma işlemini bir intent ile değiştirin: Yeni kişiler için ACTION_INSERT, güncellemeler için ACTION_EDIT veya ACTION_INSERT_OR_EDIT.
  • Insert.DATA içinde yalnızca standart veri türlerini kullanın. Arama veya mesaj işlemlerini Kişi Dizini'ne taşıyın.
  • Yukarıdaki tabloyu kullanarak MANAGE_CONTACTS hizmetine gerçekten ihtiyacınız olup olmadığına karar verin . Kullanıyorsanız Google Play Console beyanınızı planlayın.
  • Hiçbir kod yolunun ihtiyacı kalmadığında WRITE_CONTACTS öğesini manifest dosyanızdan kaldırın .

Zaman Çizelgesi

Zaman:Bu durumda ne olur?
21 Ekim 2026Google Play, MANAGE_CONTACTS politikasını duyurdu
2026 (Android 17 Üç Aylık Platform Sürümü 2)MANAGE_CONTACTS izni kullanılabilir hale gelir.
2027 (Yaklaşan Android sürümü)WRITE_CONTACTS, yakında çıkacak Android sürümünü hedefleyen uygulamalara artık yazma erişimi vermeyecek. Kişi niyetleri cihazlar arasında standartlaştırılmıştır.
2027, yaklaşan Android sürümünden önce değilGoogle Play Console, MANAGE_CONTACTS kullanan uygulamalardan beyan göndermelerini ister
2027, yaklaşan Android sürümünden önce değilPlay politikasına uygunluk zorunludur

SSS

  • Bu durum her uygulamayı etkiler mi?
    • WRITE_CONTACTS desteğinin sonlandırılmasıyla ilgili değişiklik yalnızca yaklaşan Android sürümünü ve sonraki sürümleri hedefleyen uygulamalar için geçerlidir. Eski sürümleri hedefleyen uygulamalar mevcut davranışlarını korur ancak yeni standartlaştırılmış kişi düzenleyici, hedef SDK'larından bağımsız olarak yeni OS'te çalışan tüm uygulamalarda kullanılabilir.
  • Uygulamam, intent kullanarak kişileri silebilir mi?
    • Hayır. Kişileri silmek için bir intent yoktur. Kullanıcılar, kişiler uygulamasındaki kişileri silebilir. MANAGE_CONTACTS iznine sahip uygulamalar, kişileri doğrudan silebilir.
  • Kendi kişi düzenleme ekranım var. Kullanmaya devam edebilir miyim?
    • Yalnızca uygulamanız MANAGE_CONTACTS için uygunsa. Özel bir tasarımı korumak istemeniz tek başına geçerli bir neden değildir.
  • MANAGE_CONTACTS, READ_CONTACTS izninin yerini mi alıyor?
    • MANAGE_CONTACTS, okuma erişimini içerir. Bu nedenle her ikisini de istemeniz gerekmez ancak birçok uygulama, kişileri değiştirmesi gerekmediği halde READ_CONTACTS için uygundur. Bu uygulamalar READ_CONTACTS izni istemeye devam edebilir.
  • Android'in eski sürümlerini kullanan kullanıcılarım ne olacak?
    • Kişi intent'leri, cihazın kişiler uygulaması tarafından işlenerek eski sürümlerde de çalışır. Çoğu uygulama, bu intent'leri kullanarak tüm cihazlarda iyi çalışır. Uygulamanız yalnızca en yeni sürümlerde çözülen belirli bir tutarlılık sorunundan etkileniyorsa manifestinizdeki WRITE_CONTACTS iznini uygun bir maxSdkVersion ile kapsamlı tutabilirsiniz.
Okumaya devam et