Contacts Provider

Kişi Sağlayıcı, cihazın kişilerle ilgili merkezi veri deposunu yöneten güçlü ve esnek bir Android bileşenidir. Kişiler Sağlayıcı, cihazın kişiler uygulamasında gördüğünüz verilerin kaynağıdır. Ayrıca kendi uygulamanızda bu sağlayıcının verilerine erişebilir ve cihaz ile online hizmetler arasında veri aktarabilirsiniz. Sağlayıcı, geniş bir veri kaynağı yelpazesi vardır ve her kullanıcı için mümkün olduğunca çok veriyi yönetmeye çalışır. organizasyonu karmaşıktır. Bu nedenle, sağlayıcının API'sinde bir sözleşme sınıfları ve arayüzler, hem veri alımını hem de tıklayın.

Bu kılavuzda aşağıdakiler açıklanmaktadır:

  • Temel sağlayıcı yapısı.
  • Sağlayıcıdan veri alma.
  • Sağlayıcıdaki veriler nasıl değiştirilir?
  • Sunucunuzdaki verileri Kişi Sağlayıcı.

Bu kılavuzda, Android içerik sağlayıcılarla ilgili temel bilgilere sahip olduğunuz varsayılmaktadır. Daha fazla bilgi edinmek için hakkında daha fazla bilgi için İçerik Sağlayıcı ile ilgili temel bilgiler rehberini inceleyin.

Kişi Sağlayıcı kuruluşu

Kişiler Sağlayıcı, Android içerik sağlayıcı bileşenidir. Bir kişiyle ilgili üç tür veri tutar. Bu verilerin her biri, sağlayıcı tarafından sunulan bir tabloya karşılık gelir (Şekil 1'de gösterilmiştir):

Şekil 1. Kişi Sağlayıcı tablo yapısı.

Bu üç tabloya genellikle sözleşme sınıflarının adı verilmiştir. Sınıflar içerik URI'leri, sütun adları ve tablolar tarafından kullanılan sütun değerleri için sabitler tanımlayın:

ContactsContract.Contacts tablo
. Ham kişi satırlarının toplamlarına göre, farklı kişileri temsil eden satırlar.
ContactsContract.RawContacts tablo
. Kullanıcı verilerinin özetini, kullanıcı hesabı ve türüne özel olarak içeren satırlar.
ContactsContract.Data tablo
. E-posta adresleri veya telefon numaraları gibi işlenmemiş iletişim bilgilerini içeren satırlar.

ContactsContract bölgesindeki sözleşme sınıfları tarafından temsil edilen diğer tablolar Kişiler Sağlayıcısı'nın işlemlerini veya desteğini yönetmek için kullandığı yardımcı tablolardır cihazın kişilerindeki veya telefon uygulamalarındaki belirli işlevler.

Ham kişiler

Ham kişi, bir kişinin tek bir hesap türünden ve hesap adından gelen verilerini temsil eder. Kişi Sağlayıcısı, birden fazla online hizmete izin verilip verilmeyeceğine, verilerini paylaşmazsanız Kişi Sağlayıcısı, aynı kişi için birden çok ham kişiye izin verir. Birden fazla ham kişi, kullanıcının bir kişinin aynı hesap türünde birden fazla hesaptaki verilerini birleştirmesine de olanak tanır.

Ham bir kişiyle ilgili verilerin çoğu ContactsContract.RawContacts tablosunda depolanmaz. Bunun yerine, ContactsContract.Data tablosundaki bir veya daha fazla satırda saklanır. Her veri satırında, üst ContactsContract.RawContacts satırının RawContacts._ID değerini içeren bir Data.RAW_CONTACT_ID sütunu bulunur.

Önemli ham kişi sütunları

ContactsContract.RawContacts tablosundaki önemli sütunlar 1. tabloda listelenmiştir. Lütfen tablodan sonra aşağıdaki notları okuyun:

Tablo 1. Önemli ham kişi sütunları.

Sütun adı Kullanım Notlar
ACCOUNT_NAME Bu ham iletişimin kaynağı olan hesap türünün adı. Örneğin, bir Google Hesabı'nın hesap adı, cihaz sahibinin Gmail adreslerinden biridir. Daha fazla bilgi için ACCOUNT_TYPE ile ilgili sonraki girişe bakın. Bu adın biçimi hesap türüne özgüdür. Bu değer mutlaka bir e-posta adresi
ACCOUNT_TYPE Bu ham kişinin kaynağı olan hesap türü. Örneğin, bir Google Hesabı'nın hesap türü com.google'tür. Her zaman hesap türünüzün uygun olmasını sağlayın alan tanımlayıcısını kullanabilirsiniz. Böylece, benzersiz olması gerekir. Kişi verileri sunan hesap türlerinde genellikle Kişi Sağlayıcı ile senkronize eden ilişkili bir senkronizasyon adaptörü bulunur.
DELETED "Silinen" flag'lerini kullanabilirsiniz. Bu işaret, senkronizasyon bağdaştırıcılar satırı sunucularından silene ve ardından nihayet depodan silene kadar Kişi Sağlayıcı'nın satırı dahili olarak korumasına olanak tanır.

Notlar

Aşağıda, ContactsContract.RawContacts tablosu:

  • Bir ham kişinin adı, ContactsContract.RawContacts Bunun yerine ContactsContract.Data tablosunda, ContactsContract.CommonDataKinds.StructuredName satır. Ham bir kişi, ContactsContract.Data tablosunda bu türden yalnızca bir satıra sahiptir.
  • Dikkat: Ham iletişim satırında kendi hesap verilerinizi kullanmak için önce AccountManager ile kaydedilmesi gerekir. Bunun için de kullanıcıların hesap türünü ve hesap adlarını hesap listesine eklemesini isteyin. Bunu yapmazsanız Kişi Sağlayıcı, ham kişi satırınızı otomatik olarak siler.

    Örneğin, uygulamanızın com.example.dataservice alan adıyla web tabanlı hizmetiniz için kişi verilerini korumasını istiyorsanız ve kullanıcının hizmetiniz için hesabı becky.sharp@dataservice.example.com ise uygulamanızın ham kişi satırları ekleyebilmek için kullanıcının önce hesap "türünü" (com.example.dataservice) ve hesap "adını" (becky.smart@dataservice.example.com) eklemesi gerekir. Bu gerekliliği kullanıcıya belgelerde açıklayabilir veya kullanıcının veya her ikisini birden eklemenizi öneririz. Hesap türleri ve hesap adları sonraki bölümde daha ayrıntılı olarak açıklanmıştır.

Ham kişi verilerinin kaynakları

Ham kişilerin nasıl çalıştığını anlamak için cihazında aşağıdaki üç kullanıcı hesabı tanımlanmış olan "Emily Dickinson" kullanıcısını düşünün:

  • emily.dickinson@gmail.com
  • emilyd@gmail.com
  • "belle_of_amherst" Twitter hesabı

Bu kullanıcı, şu üçü için de Kişileri Senkronize Et'i etkinleştirmiştir: Hesaplar ayarları.

Emily Dickinson'ın bir tarayıcı penceresi açıp Gmail'e emily.dickinson@gmail.com, açılış ile iletişim kurar ve "Thomas Higginson"ı ekler. Daha sonra Gmail'e şu hesapla giriş yapar: emilyd@gmail.com ve "Thomas Higginson"a bir e-posta gönderecek. Bu e-posta otomatik olarak kişi olarak ekler. "colonel_tom"u da takip ediyor (Thomas Higginson'ın Twitter kimliği) Twitter

Kişi Sağlayıcı, bu çalışma sonucunda üç ham kişi oluşturur:

  1. emily.dickinson@gmail.com ile ilişkili "Thomas Higginson" adlı ham kişi. Kullanıcı hesabı türü Google'dır.
  2. emilyd@gmail.com ile ilişkili "Thomas Higginson" için ikinci bir ham kişi. Kullanıcı hesabı türü de Google'dır. Her zaman ikinci bir ham temas ancak ad önceki adla bire bir aynı olsa da, kişi hesap oluşturabilirsiniz.
  3. "Thomas Higginson" için üçüncü ham kişi "belle_of_amherst" ile ilişkilidir. Kullanıcı hesabı türü Twitter.

Veri

Daha önce de belirtildiği gibi, ham bir kişinin verileri, ham kişinin _ID değerine bağlı bir ContactsContract.Data satırında depolanır. Bu, tek bir ham kişinin aynı öğenin birden fazla örneğinin olmasına izin verir telefon numaraları veya e-posta adresleri gibi Örneğin, "Thomas Higginson" emilyd@gmail.com için (Thomas Higginson'ın ham iletişim satırı emilyd@gmail.com) bir ev e-posta adresine sahip olan hesap thigg@gmail.com ve şu iş e-posta adresi: thomas.higginson@gmail.com ise, Kişi Sağlayıcı iki e-posta adresini satırların her ikisini de ham kişiye bağlar.

Farklı veri türlerinin bu tek tabloda depolandığına dikkat edin. Görünen ad Telefon numarası, e-posta, posta adresi, fotoğraf ve web sitesi ayrıntısı satırlarının tümü ContactsContract.Data tablosu. Bu durumu yönetmenize yardımcı olmak için ContactsContract.Data tablosunda açıklayıcı ada sahip bazı sütunlar ve genel ada sahip diğer sütunlar bulunur. Açıklayıcı ad sütununun içeriği aynı anlama gelir satırdaki veri türünden bağımsız olarak, genel ad sütununun içeriği veri türüne göre farklı anlamlara gelebilir.

Açıklayıcı sütun adları

Açıklayıcı sütun adlarına bazı örnekler:

RAW_CONTACT_ID
Bu verilere ait ham kişinin _ID sütununun değeri.
MIMETYPE
Bu satırda depolanan verilerin türü (özel MIME türü olarak ifade edilir). Kişi Sağlayıcı şu alt sınıflarda tanımlanan MIME türlerini kullanır: ContactsContract.CommonDataKinds Bu MIME türleri açık kaynaktır ve Kişiler Sağlayıcı ile çalışan tüm uygulamalar veya senkronizasyon bağdaştırıcılar tarafından kullanılabilir.
IS_PRIMARY
Bu tür bir veri satırı ham bir kişi için birden fazla kez oluşabiliyorsa IS_PRIMARY sütunu, türün birincil verilerini içeren veri satırını işaretler. Örneğin, kullanıcı bir kişinin telefon numarasına uzun basıp Varsayılan olarak ayarla'yı seçerse bu numarayı içeren ContactsContract.Data satırının IS_PRIMARY sütunu sıfır olmayan bir değere ayarlanır.

Genel sütun adları

Genel olarak kullanılabilen DATA1 ile DATA15 arasında 15 genel sütun ve yalnızca senkronizasyon bağdaştırıcılar tarafından kullanılması gereken SYNC1 ile SYNC4 arasında 4 genel sütun vardır. Genel sütun adı sabitleri, satırdaki veriler.

DATA1 sütunu dizine eklenmiş. Kişi Sağlayıcı, bir sorgunun en sık hedefi olacağını düşündüğü veriler için bu sütunu her zaman kullanır. Örneğin, bir e-posta satırında bu sütun gerçek e-posta adresini içerir.

DATA15 sütunu, fotoğraf küçük resimleri gibi büyük ikili nesne (BLOB) verilerini depolamak için ayrılmıştır.

Türe özel sütun adları

Kişi Sağlayıcı, belirli bir satır türüne ait sütunlarla çalışmayı kolaylaştırmak için ContactsContract.CommonDataKinds alt sınıflarında tanımlanan türe özgü sütun adı sabitleri de sağlar. Sabit değerler basitçe bir Böylece, bir satırındaki verilere erişmenize yardımcı olur. Bu, aynı sütun adına farklı bir sabit ad emin olmanız gerekir.

Örneğin, ContactsContract.CommonDataKinds.Email sınıfı ContactsContract.Data satırı için türe özel sütun adı sabitleri bu hedefleme türünde Email.CONTENT_ITEM_TYPE. Sınıf, e-posta adresi sütunu için ADDRESS sabit değerini içerir. ADDRESS değerinin gerçek değeri "data1"dır ve sütunun genel adıyla aynıdır.

Dikkat: Kendi özel verilerinizi ContactsContract.Data sağlayıcının önceden tanımlanmış MIME türleri. Bunu yaparsanız verileri kaybedebilirsiniz veya sağlayıcı, olabilir. Örneğin, MIME türünde bir satır eklememeniz gerekir bir e-posta adresi yerine kullanıcı adı içeren Email.CONTENT_ITEM_TYPE sütun DATA1. Satır için kendi özel MIME türünüzü kullanıyorsanız türe özgü kendi sütun adlarınızı tanımlayabilir ve sütunları istediğiniz gibi kullanabilirsiniz.

Şekil 2'de açıklayıcı sütunların ve veri sütunlarının ContactsContract.Data satır ve türe özel sütun adlarının "yer paylaşımı" olarak adlandırılması genel sütun adlarını

Türe özel sütun adları, genel sütun adlarıyla nasıl eşlenir?

Şekil 2. Türe özel sütun adları ve genel sütun adları.

Türe özel sütun adı sınıfları

Tablo 2'de, türe özel en yaygın sütun adı sınıfları listelenmiştir:

Tablo 2. Türe özel sütun adı sınıfları

Sınıf eşleme Veri türü Notlar
ContactsContract.CommonDataKinds.StructuredName Bu veri satırıyla ilişkilendirilmiş ham kişinin ad verileri. Ham kişilerde bu satırlardan yalnızca biri bulunur.
ContactsContract.CommonDataKinds.Photo Bu veri satırıyla ilişkilendirilmiş ham kişinin ana fotoğrafı. Ham kişilerde bu satırlardan yalnızca biri bulunur.
ContactsContract.CommonDataKinds.Email Bu veri satırıyla ilişkilendirilmiş ham kişinin e-posta adresi. Ham bir kişinin birden fazla e-posta adresi olabilir.
ContactsContract.CommonDataKinds.StructuredPostal Bu veri satırıyla ilişkili ham kişinin posta adresi. Ham bir kişinin birden fazla posta adresi olabilir.
ContactsContract.CommonDataKinds.GroupMembership Ham kişiyi Kişi Sağlayıcı'daki gruplardan birine bağlayan bir tanımlayıcı. Gruplar, hesap türünün ve hesap adının isteğe bağlı bir özelliğidir. Bu gruplar Kişi grupları bölümünde daha ayrıntılı olarak açıklanmıştır.

Kişiler

Kişi Sağlayıcı, tüm hesap türlerindeki ve hesap adlarındaki ham kişi satırlarını birleştirir bir kişi oluşturun. Bu, kullanıcı rızası almak için reklam alanındaki tüm verileri kişi için topladığı verilerdir. Kişi Sağlayıcı, yeni kişi satırlarının oluşturulmasını ve ham kişilerin mevcut bir kişi satırıyla toplanmasını yönetir. Uygulamaların veya senkronizasyon bağdaştırıcıların kişiler eklemesine izin verilmez ve kişi satırındaki bazı sütunlar salt okunurdur.

Not: Kişi sağlayıcıya insert() içeren bir kişi eklemeye çalışırsanız UnsupportedOperationException istisnası alırsınız. Bir sütunu güncellemeye çalışırsanız "salt okunur" olarak listelenen güncelleme yoksayılır.

Kişi Sağlayıcı yeni bir ham kişi eklenmesine yanıt olarak yeni bir kişi oluşturur mevcut kişilerle eşleşmiyor. Sağlayıcı bunu, mevcut kişinin verileri, daha önce iletişim kurduğu kişiyle artık eşleşmeyecek şekilde değişiyorsa dikkat edin. Bir uygulama veya senkronizasyon bağdaştırıcısı, mevcut bir kişiyle eşleşen yeni bir ham kişi oluşturursa yeni ham kişi mevcut kişiyle birleştirilir.

Kişi Sağlayıcı, bir kişi satırını ham kişi satırlarına kişi satırının Contacts içindeki _ID sütunu tablosunu oluşturalım. Ham kişiler tablosunun CONTACT_ID sütunu ContactsContract.RawContacts, şunun için _ID değer içeriyor: her ham kişi satırıyla ilişkili kişiler satırı bulunur.

ContactsContract.Contacts tablosunda, kişi satırına "kalıcı" bir bağlantı olan LOOKUP_KEY sütunu da bulunur. Çünkü Kişi Sağlayıcı, kişileri kişi satırının _ID değeri otomatik olarak değişebilir yanıt olarak belirlemeniz gerekir. Böyle bir durumda bile, kişinin LOOKUP_KEY ile birlikte CONTENT_LOOKUP_URI içerik URI'si, kişi satırını işaretlemeye devam eder. Bu nedenle, "favori" kişilere ve benzeri bağlantıları korumak için LOOKUP_KEY'yi kullanabilirsiniz. Bu sütunun kendine ait bir biçimi vardır: _ID sütununun biçimiyle alakasız.

Şekil 3'te, üç ana tablonun birbiriyle nasıl ilişkili olduğu gösterilmektedir.

Kişi sağlayıcı ana tabloları

Şekil 3. Kişiler, Ham Kişiler ve Ayrıntılar tablo ilişkileri.

Dikkat: Uygulamanızı Google Play Store'da yayınlarsanız veya uygulamanız Android 10 (API düzeyi 29) veya sonraki sürümleri çalıştıran bir cihazdaysa sınırlı sayıda kişi verileri alanının ve yönteminin kullanımdan kaldırıldığını unutmayın.

Sistem, belirtilen koşullar kapsamında tüm değerleri düzenli olarak siler. şu veri alanlarına yazılır:

Yukarıdaki veri alanlarını ayarlamak için kullanılan API'ler de eskidir:

Ayrıca, aşağıdaki alanlar artık sık iletişim kurulan kişileri döndürmemektedir. Bu alanların bazılarının, yalnızca belirli bir veri türünün parçası olan kişilerin sıralamasını etkilediğini unutmayın.

Uygulamalarınız bu alanlara veya API'lere erişiyorsa ya da bunları güncelliyorsa alternatif yöntemler kullanın. Örneğin, özel içerik sağlayıcıları veya uygulamanızda ya da arka uç sistemlerinizde depolanan diğer verileri kullanarak belirli kullanım alanlarını karşılayabilirsiniz.

Uygulamanızın işlevselliğinin bu değişiklikten etkilenmediğini doğrulamak için bu veri alanlarını manuel olarak temizleyebilirsiniz. Bunu yapmak için Android 4.1 (API düzeyi 16) veya sonraki sürümleri çalıştıran bir cihazda aşağıdaki ADB komutunu çalıştırın:

adb shell content delete \
--uri content://com.android.contacts/contacts/delete_usage

Senkronizasyon bağdaştırıcılarından alınan veriler

Kullanıcılar kişi verilerini doğrudan cihaza girerler, ancak veriler Kişiler'e de aktarılır Senkronizasyon bağdaştırıcıları aracılığıyla web hizmetleri sağlayıcısı Cihaz ile hizmetler arasında veri aktarımı. Senkronizasyon bağdaştırıcıları arka planda çalışıyor tarafından yönetilen bir reklamverendir ve ContentResolver yöntemlerini çağırırlar. verileri yönetmek için kullanılır.

Android'de, senkronizasyon bağdaştırıcının çalıştığı web hizmeti bir hesap türüyle tanımlanır. Her senkronizasyon bağdaştırıcısı tek bir hesap türüyle çalışır ancak bu tür için birden fazla hesap adını destekleyebilir. Hesap türleri ve hesap adları, Ham kişi verilerinin kaynakları bölümünde kısaca açıklanmaktadır. Aşağıdaki tanımlar daha fazla ayrıntı sunar ve hesap türünün ve adının senkronizasyon bağdaştırıcılar ve hizmetlerle ilişkisini açıklar.

Hesap türü
. Kullanıcının veri depoladığı hizmeti tanımlar. Çoğu zaman kullanıcının hizmetle kimlik doğrulamalısınız. Örneğin, Google Kişileri tanımlanmış bir google.com koduna göre. Bu değer, AccountManager tarafından kullanılan hesap türüne karşılık gelir.
Hesap adı
. Belirli bir hesabı veya bir hesap türü için giriş bilgilerini tanımlar. Google Kişiler hesapları hesap adı olarak bir e-posta adresine sahip olan Google Hesapları ile aynıdır. Diğer hizmetler tek kelimelik bir kullanıcı adı veya sayısal kimlik kullanabilir.

Hesap türlerinin benzersiz olması gerekmez. Kullanıcılar birden fazla Google Kişiler hesabı yapılandırabilir ve verilerini Kişiler Sağlayıcı'ya indirebilir. Bu durum, kullanıcının kişisel hesap adı için bir kişisel kişi grubu ve iş için başka bir kişi grubu varsa ortaya çıkabilir. Hesap adları genellikle benzersizdir. Bu iki öğe birlikte, Kişi Sağlayıcı ile harici bir hizmet arasında belirli bir veri akışı tanımlar.

Hizmetinizin verilerini Kişi Sağlayıcısı'na aktarmak istiyorsanız kendi senkronizasyon bağdaştırıcınız olsun. Bu konu Kişi Sağlayıcı senkronizasyon bağdaştırıcılar bölümünde daha ayrıntılı olarak açıklanmıştır.

Şekil 4'te Kişi Sağlayıcı'nın veri akışına nasıl uyum sağladığı gösterilmektedir düşünmeye başladım. "Bağdaştırıcıları senkronize et" ifadesinin yer aldığı kutuda her bağdaştırıcı hesap türüne göre etiketlenir.

Kullanıcılarla ilgili veri akışı

4.Şekil Kişiler Sağlayıcı veri akışı.

Gerekli izinler

Kişiler sağlayıcısına erişmek isteyen uygulamaların aşağıdaki izinleri istemesi gerekir:

Bir veya daha fazla tabloya okuma erişimi
READ_CONTACTS, AndroidManifest.xml içinde <uses-permission> öğesiyle <uses-permission android:name="android.permission.READ_CONTACTS"> olarak belirtilir.
Bir veya daha fazla tabloya yazma erişimi
. WRITE_CONTACTS, belirtilen AndroidManifest.xml <uses-permission> öğesi: <uses-permission android:name="android.permission.WRITE_CONTACTS">.

Bu izinler, kullanıcı profili verilerini kapsamaz. Kullanıcı profili ve gerekli izinler aşağıdaki bölümde açıklanmıştır, Kullanıcı profili.

Kullanıcının kişi verilerinin kişisel ve hassas olduğunu unutmayın. Kullanıcılar gizlilik konusunda endişeli olduğundan, uygulamalardan kendileri veya kişileri hakkında veri toplamamalarını ister. Kişi verilerine erişmek için neden izine ihtiyacınız olduğu anlaşılmıyorsa kullanıcılar uygulamanıza düşük puan verebilir veya uygulamayı yüklemeyi reddedebilir.

Kullanıcı profili

ContactsContract.Contacts tablosunda, aşağıdakileri içeren tek bir satır var profil verileri. Bu verilerde, cihazın user özellikleri açıklanır daha doğru sonuçlar verebilir. Profil kişileri satırı, profil kullanan her sistem için ham bir kişiler satırına bağlanır. Her profil ham kişi satırında birden fazla veri satırı olabilir. Kullanıcı profiline erişmek için gereken sabitler ContactsContract.Profile sınıfında bulunur.

Kullanıcı profiline erişim için özel izinler gerekir. Ayrıca READ_CONTACTS ve Okuma, yazma ve erişim için WRITE_CONTACTS izin gerekli eklemek için android.Manifest.permission#READ_PROFILE ve Okuma ve yazma erişimi için android.Manifest.permission#WRITE_PROFILE izinleri, tıklayın.

Kullanıcının profilini hassas olarak göz önünde bulundurmanız gerektiğini unutmayın. android.Manifest.permission#READ_PROFILE izni, cihaz kullanıcısının kimliğini tanımlayabilecek verilerine erişmenize olanak tanır. Kullanıcıya nedenini açıklayın uygulamanızın açıklamasında kullanıcı profili erişim izinlerine sahip olmanız gerekir.

Kullanıcının profilini içeren kişi satırını almak için ContentResolver.query() işlevini çağırın. İçerik URI'sini CONTENT_URI olarak ayarlayın ve herhangi bir seçim ölçütü sağlamaz. Bu içerik URI'sini, profilin ham kişilerini veya verilerini almak için temel URI olarak da kullanabilirsiniz. Örneğin, bu snippet profille ilgili verileri alır:

Kotlin

// Sets the columns to retrieve for the user profile
projection = arrayOf(
        ContactsContract.Profile._ID,
        ContactsContract.Profile.DISPLAY_NAME_PRIMARY,
        ContactsContract.Profile.LOOKUP_KEY,
        ContactsContract.Profile.PHOTO_THUMBNAIL_URI
)

// Retrieves the profile from the Contacts Provider
profileCursor = contentResolver.query(
        ContactsContract.Profile.CONTENT_URI,
        projection,
        null,
        null,
        null
)

Java

// Sets the columns to retrieve for the user profile
projection = new String[]
    {
        Profile._ID,
        Profile.DISPLAY_NAME_PRIMARY,
        Profile.LOOKUP_KEY,
        Profile.PHOTO_THUMBNAIL_URI
    };

// Retrieves the profile from the Contacts Provider
profileCursor =
        getContentResolver().query(
                Profile.CONTENT_URI,
                projection ,
                null,
                null,
                null);

Not: Birden fazla kişi satırı alırsanız ve bunlardan birinin kullanıcı profili olup olmadığını belirlemek isterseniz satırın IS_USER_PROFILE sütununu test edin. Kişi kullanıcı profiliyse bu sütun "1" olarak ayarlanır.

Kişi Sağlayıcı meta verileri

Kişiler Sağlayıcısı, depodur. Kod deposuyla ilgili bu meta veriler Ham Kişiler, Veriler ve Kişiler tablosu satırları, ContactsContract.Settings tablosu ve ContactsContract.SyncState tablo. Aşağıdaki tabloda bu meta veri parçalarının her birinin etkisi gösterilmektedir:

Tablo 3. Kişiler sağlayıcısında meta veriler

Tablo Sütun Değerler Anlamı
ContactsContract.RawContacts DIRTY "0" - son senkronizasyondan bu yana değişmedi. Cihazda değiştirilmiş ve sunucu. Android uygulamaları bir satırı güncellediğinde değer, Kişiler Sağlayıcı tarafından otomatik olarak ayarlanır.

Ham kişi veya veri tablolarını değiştiren senkronizasyon bağdaştırıcılar, kullandıkları içerik URI'sine her zaman CALLER_IS_SYNCADAPTER dizesini eklemelidir. Bu, sağlayıcının satırları kirli olarak işaretlemesini önler. Aksi takdirde, senkronizasyon bağdaştırıcısı değişiklikleri yerel değişiklikler olarak görünür ve sunucu, değişikliğin kaynağı olsa bile sunucuya gönderilir.

"1" - son senkronizasyondan sonra değiştirildi, sunucuyla tekrar senkronize edilmesi gerekiyor.
ContactsContract.RawContacts VERSION Bu satırın sürüm numarası. Kişi Sağlayıcı, satır veya ilgili verileri her değiştiğinde bu değeri otomatik olarak artırır.
ContactsContract.Data DATA_VERSION Bu satırın sürüm numarası. Kişi Sağlayıcı, veri satırı değiştiğinde bu değeri otomatik olarak artırır.
ContactsContract.RawContacts SOURCE_ID Bu ham kişiyi hesapla benzersiz şekilde tanımlayan bir dize değeri oluşturuldu. Bir senkronizasyon bağdaştırıcısı yeni bir ham kişi oluşturduğunda bu sütun işlenmemiş kişi için sunucunun benzersiz kimliği. Bir Android uygulaması, yeni bir ham kişi değilse, uygulama bu sütunu boş bırakmalıdır. Bu, senkronizasyon bağdaştırıcısı için sunucuda yeni bir ham kişi oluşturması ve SOURCE_ID için bir değer alması gerektiğini belirtir.

Özellikle, kaynak kimliği her hesap için benzersiz olmalıdır türü ve senkronizasyonlarda kararlı olmalıdır:

  • Benzersiz: Bir hesaptaki her ham kişinin kendi kaynak kimliği olmalıdır. Bu koşulu uygulamazsanız kişiler uygulamasında sorunlara yol açarsınız. Aynı hesap türü için iki işlenmemiş kişinin aynı kaynak kimliğidir. Örneğin, emily.dickinson@gmail.com hesabındaki "Thomas Higginson" adlı ham kişinin, emilyd@gmail.com hesabındaki "Thomas Higginson" adlı ham kişiyle aynı kaynak kimliğe sahip olmasına izin verilir.
  • Kararlı: Kaynak kimlikleri, ham kişi. Örneğin, kullanıcı Uygulamalar ayarlarından Kişiler Depolama'sını temizleyip yeniden senkronize ederse geri yüklenen ham kişilerin kaynak kimlikleri öncekiyle aynı olmalıdır. Bunu zorunlu kılmazsanız kısayollar durdurulur çalışmadır.
ContactsContract.Groups GROUP_VISIBLE "0" - Bu gruptaki kişiler, Android uygulamasının kullanıcı arayüzlerinde görünmeyecektir. Bu sütun, kullanıcının belirli gruplardaki kişileri gizlemesine izin veren sunucularla uyumluluk içindir.
"1": Bu gruptaki kişilerin uygulama kullanıcı arayüzlerinde görünmesine izin verilir.
ContactsContract.Settings UNGROUPED_VISIBLE "0" - Bu hesap ve hesap türünde bir gruba ait olmayan kişiler Android uygulaması kullanıcı arayüzlerine görünmez. Ham kişilerinden hiçbiri bir gruba ait değilse kişiler varsayılan olarak görünmez (Ham bir kişinin grup üyeliği, ContactsContract.Data tablosunda bir veya daha fazla ContactsContract.CommonDataKinds.GroupMembership satırı ile belirtilir). ContactsContract.Settings tablo satırında bu işareti ayarlayarak bir hesap türü ve hesapta, grupları olmayan kişilerin görünür olmasını zorunlu kılabilirsiniz. Bu işaretin bir kullanım alanı, grup kullanmayan sunuculardaki kişileri göstermektir.
"1": Bu hesap ve hesap türü için bir gruba ait olmayan kişiler uygulama kullanıcı arayüzlerine görünür.
ContactsContract.SyncState (tümü) Senkronizasyon bağdaştırıcınızın meta verilerini depolamak için bu tabloyu kullanın. Bu tabloda, senkronizasyon durumunu ve senkronizasyonla ilgili diğer verileri şurada kalıcı olarak depolayabilirsiniz: için geçerlidir.

Kişi Sağlayıcı erişimi

Bu bölümde, Kişi Sağlayıcı'dan verilere erişmeyle ilgili yönergeler açıklanmakta olup aşağıdakilere odaklanılmaktadır:

  • Öğe sorguları.
  • Toplu değişiklik.
  • Amaçlarla alma ve değiştirme.
  • Veri bütünlüğü.

Senkronizasyon bağdaştırıcısı üzerinde değişiklik yapma konusunda ayrıca bu bölümde daha ayrıntılı olarak anlatılmıştır. Kişi Sağlayıcı senkronizasyon bağdaştırıcıları.

Varlıkları sorgulama

Kişi Sağlayıcı tabloları bir hiyerarşiye göre düzenlendiğinden, bir satırı ve tüm "child" öğelerini alın satır sayısını gösterir. Örneğin, bir kişiye ait tüm bilgileri almak isterseniz, Tek bir için ContactsContract.RawContacts satır ContactsContract.Contacts satır veya tüm Tek bir için ContactsContract.CommonDataKinds.Email satır ContactsContract.RawContacts satır. Bu işlemi kolaylaştırmak için Kişiler Sağlayıcı, diğer platformlar arasında veritabanı birleştirme gibi çalışan entity yapıları sunar tablolarında anlatacağım.

Varlık, bir üst tablodaki ve alt tablosundaki seçili sütunlardan oluşan bir tablo gibidir. Bir varlığı sorguladığınızda sütunlara dayalı bir projeksiyon ve arama ölçütleri sağlarsınız gerçekleştirilebilir. Sonuç, alınan her alt tablo satırı için bir satır içeren bir Cursor olur. Örneğin, Kişi adı için ContactsContract.Contacts.Entity ve bunların tümü için ContactsContract.CommonDataKinds.Email satırın tamamını o ad için ham kişiler listesi görüntülerseniz, içinde tek satır olan bir Cursor her ContactsContract.CommonDataKinds.Email satır için.

Varlıklar sorguları basitleştirir. Varlık kullanarak bir öğeye ait tüm kişi verilerini alabilirsiniz öğesini almak için önce üst tabloyu sorgulamak yerine, Kimlik ile alt tabloyu bu kimlikle sorgulamak zorunda kalırsınız. Ayrıca Kişi Sağlayıcı, tek bir işlemde bir varlığa karşı yapılan bir sorgudur. Bu sorgu, alınan verilerin iç tutarlılığı sağlar.

Not: Bir öğe genellikle üst öğenin tüm sütunlarını ve alt tablo. Sütun adı listesinde yer almayan bir sütun adıyla çalışmaya çalışırsanız varlık için sabit değerler kullanırsanız bir Exception elde edersiniz.

Aşağıdaki snippet'te bir kişinin tüm ham kişi satırlarının nasıl alınacağı gösterilmektedir. Snippet "ana" olmak üzere iki etkinliği olan daha büyük bir uygulamanın parçasıdır "ayrıntı" diyebiliriz. Ana etkinlik, iletişim kişisi satırlarının listesini gösterir. Kullanıcı bir satır seçtiğinde etkinlik, satırın kimliğini ayrıntı etkinliğine gönderir. Ayrıntı etkinliği, ContactsContract.Contacts.Entity öğesini kullanır ilişkilendirilmiş ham kişilerin tüm veri satırlarını görüntülemek için ile iletişime geçin.

Bu snippet, "ayrıntı" etkinliğinden alınmıştır:

Kotlin

...
    /*
     * Appends the entity path to the URI. In the case of the Contacts Provider, the
     * expected URI is content://com.google.contacts/#/entity (# is the ID value).
     */
    contactUri = Uri.withAppendedPath(
            contactUri,
            ContactsContract.Contacts.Entity.CONTENT_DIRECTORY
    )

    // Initializes the loader identified by LOADER_ID.
    loaderManager.initLoader(
            LOADER_ID,  // The identifier of the loader to initialize
            null,       // Arguments for the loader (in this case, none)
            this        // The context of the activity
    )

    // Creates a new cursor adapter to attach to the list view
    cursorAdapter = SimpleCursorAdapter(
            this,                       // the context of the activity
            R.layout.detail_list_item,  // the view item containing the detail widgets
            mCursor,                    // the backing cursor
            fromColumns,               // the columns in the cursor that provide the data
            toViews,                   // the views in the view item that display the data
            0)                          // flags

    // Sets the ListView's backing adapter.
    rawContactList.adapter = cursorAdapter
...
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
    /*
     * Sets the columns to retrieve.
     * RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
     * DATA1 contains the first column in the data row (usually the most important one).
     * MIMETYPE indicates the type of data in the data row.
     */
    val projection: Array<String> = arrayOf(
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
            ContactsContract.Contacts.Entity.DATA1,
            ContactsContract.Contacts.Entity.MIMETYPE
    )

    /*
     * Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
     * contact collated together.
     */
    val sortOrder = "${ContactsContract.Contacts.Entity.RAW_CONTACT_ID} ASC"

    /*
     * Returns a new CursorLoader. The arguments are similar to
     * ContentResolver.query(), except for the Context argument, which supplies the location of
     * the ContentResolver to use.
     */
    return CursorLoader(
            applicationContext, // The activity's context
            contactUri,        // The entity content URI for a single contact
            projection,         // The columns to retrieve
            null,               // Retrieve all the raw contacts and their data rows.
            null,               //
            sortOrder           // Sort by the raw contact ID.
    )
}

Java

...
    /*
     * Appends the entity path to the URI. In the case of the Contacts Provider, the
     * expected URI is content://com.google.contacts/#/entity (# is the ID value).
     */
    contactUri = Uri.withAppendedPath(
            contactUri,
            ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);

    // Initializes the loader identified by LOADER_ID.
    getLoaderManager().initLoader(
            LOADER_ID,  // The identifier of the loader to initialize
            null,       // Arguments for the loader (in this case, none)
            this);      // The context of the activity

    // Creates a new cursor adapter to attach to the list view
    cursorAdapter = new SimpleCursorAdapter(
            this,                        // the context of the activity
            R.layout.detail_list_item,   // the view item containing the detail widgets
            mCursor,                     // the backing cursor
            fromColumns,                // the columns in the cursor that provide the data
            toViews,                    // the views in the view item that display the data
            0);                          // flags

    // Sets the ListView's backing adapter.
    rawContactList.setAdapter(cursorAdapter);
...
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    /*
     * Sets the columns to retrieve.
     * RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
     * DATA1 contains the first column in the data row (usually the most important one).
     * MIMETYPE indicates the type of data in the data row.
     */
    String[] projection =
        {
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
            ContactsContract.Contacts.Entity.DATA1,
            ContactsContract.Contacts.Entity.MIMETYPE
        };

    /*
     * Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
     * contact collated together.
     */
    String sortOrder =
            ContactsContract.Contacts.Entity.RAW_CONTACT_ID +
            " ASC";

    /*
     * Returns a new CursorLoader. The arguments are similar to
     * ContentResolver.query(), except for the Context argument, which supplies the location of
     * the ContentResolver to use.
     */
    return new CursorLoader(
            getApplicationContext(),  // The activity's context
            contactUri,              // The entity content URI for a single contact
            projection,               // The columns to retrieve
            null,                     // Retrieve all the raw contacts and their data rows.
            null,                     //
            sortOrder);               // Sort by the raw contact ID.
}

Yükleme tamamlandığında LoaderManager, onLoadFinished(). Bu yönteme gelen bağımsız değişkenlerden biri, sorgunun sonuçlarını içeren bir Cursor bağımsız değişkenidir. Kendi uygulamanızda, verileri görüntülemek veya üzerinde daha fazla çalışmak için Cursor.

Toplu değişiklik

Mümkün olduğunda Kişiler Sağlayıcısı'ndaki verileri "toplu mod"u seçmek için bir ArrayList ContentProviderOperation nesne ve çağrı applyBatch(). Kişi Sağlayıcı, tüm işlemleri tek bir applyBatch() işleminde gerçekleştirdiğinden, yaptığınız değişiklikler hiçbir zaman kişi deposunu tutarsız bir durumda bırakmaz. Toplu değişiklik, aynı zamanda ham kişi ve ayrıntı verilerinin de anlamına gelir.

Not: Tek ham kişiyi değiştirmek için değişikliği uygulamanızda işlemek yerine cihazın kişiler uygulamasına intent gönderebilirsiniz. Bunu yapma hakkında daha fazla bilgiyi Intent'lerle getirme ve değiştirme bölümünde bulabilirsiniz.

Getiri puanları

Çok sayıda işlem içeren toplu bir değişiklik, diğer işlemleri engelleyebilir ve genel kullanıcı deneyiminin kötü olmasına neden olabilir. Yapmak istediğiniz tüm değişiklikleri organize etmek mümkün olduğunca az sayıda ayrı listede performans göstermelerini ve aynı zamanda bunların bir veya daha fazla işlem için getiri noktaları ayarlamanız gerekir. Verim noktası, isYieldAllowed() değeri true olarak ayarlanmış bir ContentProviderOperation nesnesi. Kişi Sağlayıcı, bir verim noktasına ulaştığında diğer işlemlerin çalışmasına izin vermek için çalışmasını duraklatır ve mevcut işlemi kapatır. Sağlayıcı tekrar işe başladığında ArrayList içinde bir sonraki işlemle devam eder ve yeni bir işleme başlar belirtir.

Getirdiğiniz puanlar, applyBatch() çağrısı başına birden fazla işlemle sonuçlanıyor. Bunun nedeni: Bu nedenle, ilgili satır kümesi için son işlem için bir getiri noktası belirlemeniz gerekir. Örneğin, ham kişi satırlarını ve ilişkili veri satırlarını ekleyen bir gruptaki son işlem veya tek bir kişiyle ilgili bir satır grubu için son işlem için bir verim noktası ayarlamanız gerekir.

Akma noktaları da atomik işlem birimleridir. İki getiri noktası arasındaki tüm erişimler tek bir birim olarak ele alacağız. Verim noktası ayarlamazsanız en küçük atomik işlem, tüm işlem grubudur. Verim noktalarını kullanırsanız işlemlerin sistem performansını düşürmesini önlerken aynı zamanda işlemlerin bir alt kümesinin atomik olmasını sağlarsınız.

Değişiklik geri referansları

Yeni bir ham kişi satırı ve ilişkili veri satırlarını ContentProviderOperation nesne için veri satırlarını şunlara bağlamanız gerekir: ham kişi satırını ekleyerek olarak _ID RAW_CONTACT_ID değeri. Ancak ham kişi satırı için ContentProviderOperation henüz uygulanmadığından, veri satırı için ContentProviderOperation oluştururken bu değer kullanılamaz. Bu sorunu çözmek için ContentProviderOperation.Builder sınıfının yöntemi var withValueBackReference(). Bu yöntem, önceki bir işlemin sonucunu içeren bir sütun eklemenize veya değiştirmenize olanak tanır.

withValueBackReference() yönteminin iki bağımsız değişkeni vardır:

key
Anahtar/değer çiftinin anahtarı. Bu bağımsız değişkenin değeri, değiştirdiğiniz tablodaki bir sütunun adı olmalıdır.
previousResult
. Dizideki bir değerin 0 tabanlı dizini Şuradan ContentProviderResult nesne: applyBatch(). Farklı toplu işlemler uygulandığında, her işlemin sonucu ara sonuç dizisidir. previousResult değeri dizindir key parametresiyle alınıp depolanan bu sonuçlardan birinin değer. Bu, yeni bir ham kişi kaydı eklemenize ve _ID değeri, ardından bir "geri referans" yapın değerini değerini ContactsContract.Data satırı eklediğinizde görebilirsiniz.

Sonuç dizisinin tamamı, applyBatch() işlevini ilk kez çağırdığınızda oluşturulur. Bu dizi, sağladığınız ContentProviderOperation nesnelerinin ArrayList boyutuna eşittir. Ancak sonuç dizisindeki tüm öğeler null olarak ayarlanır ve henüz uygulanmamış bir işlem için bir sonuca geri referans vermeye çalışırsanız withValueBackReference() Exception oluşturur.

Aşağıdaki snippet'ler yeni bir ham kişi ve verilerin toplu olarak nasıl ekleneceğini gösterir. Onlar getiri noktası oluşturan ve geri başvuru kullanan bir kod dahil edin.

İlk snippet, kullanıcı arayüzünden kişi verilerini alır. Bu noktada kullanıcı, yeni ham kişinin ekleneceği hesabı zaten seçmiştir.

Kotlin

// Creates a contact entry from the current UI values, using the currently-selected account.
private fun createContactEntry() {
    /*
     * Gets values from the UI
     */
    val name = contactNameEditText.text.toString()
    val phone = contactPhoneEditText.text.toString()
    val email = contactEmailEditText.text.toString()

    val phoneType: String = contactPhoneTypes[mContactPhoneTypeSpinner.selectedItemPosition]

    val emailType: String = contactEmailTypes[mContactEmailTypeSpinner.selectedItemPosition]

Java

// Creates a contact entry from the current UI values, using the currently-selected account.
protected void createContactEntry() {
    /*
     * Gets values from the UI
     */
    String name = contactNameEditText.getText().toString();
    String phone = contactPhoneEditText.getText().toString();
    String email = contactEmailEditText.getText().toString();

    int phoneType = contactPhoneTypes.get(
            contactPhoneTypeSpinner.getSelectedItemPosition());

    int emailType = contactEmailTypes.get(
            contactEmailTypeSpinner.getSelectedItemPosition());

Aşağıdaki snippet, ham kişi satırını ContactsContract.RawContacts tablosuna eklemek için bir işlem oluşturur:

Kotlin

    /*
     * Prepares the batch operation for inserting a new raw contact and its data. Even if
     * the Contacts Provider does not have any data for this person, you can't add a Contact,
     * only a raw contact. The Contacts Provider will then add a Contact automatically.
     */

    // Creates a new array of ContentProviderOperation objects.
    val ops = arrayListOf<ContentProviderOperation>()

    /*
     * Creates a new raw contact with its account type (server type) and account name
     * (user's account). Remember that the display name is not stored in this row, but in a
     * StructuredName data row. No other data is required.
     */
    var op: ContentProviderOperation.Builder =
            ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.name)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.type)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

Java

    /*
     * Prepares the batch operation for inserting a new raw contact and its data. Even if
     * the Contacts Provider does not have any data for this person, you can't add a Contact,
     * only a raw contact. The Contacts Provider will then add a Contact automatically.
     */

     // Creates a new array of ContentProviderOperation objects.
    ArrayList<ContentProviderOperation> ops =
            new ArrayList<ContentProviderOperation>();

    /*
     * Creates a new raw contact with its account type (server type) and account name
     * (user's account). Remember that the display name is not stored in this row, but in a
     * StructuredName data row. No other data is required.
     */
    ContentProviderOperation.Builder op =
            ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.getType())
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.getName());

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

Ardından kod; görünen ad, telefon ve e-posta satırları için veri satırları oluşturur.

Her işlem derleyici nesnesi, withValueBackReference(). almak için RAW_CONTACT_ID. Referans noktaları tekrar ContentProviderResult nesnesine dönelim. Bu işlem, ham kişi satırını ekler ve yeni _ID değerini döndürür. değer. Sonuç olarak, her veri satırı RAW_CONTACT_ID. yeni ContactsContract.RawContacts satırına eklenir.

E-posta satırını ekleyen ContentProviderOperation.Builder nesnesi, bir getiri noktası belirleyen withYieldAllowed() ile işaretlenir:

Kotlin

    // Creates the display name for the new raw contact, as a StructuredName data row.
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * withValueBackReference sets the value of the first argument to the value of
             * the ContentProviderResult indexed by the second argument. In this particular
             * call, the raw contact ID column of the StructuredName data row is set to the
             * value of the result returned by the first operation, which is the one that
             * actually adds the raw contact row.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to StructuredName
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)

            // Sets the data row's display name to the name in the UI.
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

    // Inserts the specified phone number and type as a Phone data row
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Phone
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

            // Sets the phone number and type
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

    // Inserts the specified email and type as a Phone data row
    op = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Email
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

            // Sets the email address and type
            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType)

    /*
     * Demonstrates a yield point. At the end of this insert, the batch operation's thread
     * will yield priority to other threads. Use after every set of operations that affect a
     * single contact, to avoid degrading performance.
     */
    op.withYieldAllowed(true)

    // Builds the operation and adds it to the array of operations
    ops.add(op.build())

Java

    // Creates the display name for the new raw contact, as a StructuredName data row.
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * withValueBackReference sets the value of the first argument to the value of
             * the ContentProviderResult indexed by the second argument. In this particular
             * call, the raw contact ID column of the StructuredName data row is set to the
             * value of the result returned by the first operation, which is the one that
             * actually adds the raw contact row.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to StructuredName
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)

            // Sets the data row's display name to the name in the UI.
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

    // Inserts the specified phone number and type as a Phone data row
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Phone
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

            // Sets the phone number and type
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

    // Inserts the specified email and type as a Phone data row
    op =
            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            /*
             * Sets the value of the raw contact id column to the new raw contact ID returned
             * by the first operation in the batch.
             */
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)

            // Sets the data row's MIME type to Email
            .withValue(ContactsContract.Data.MIMETYPE,
                    ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

            // Sets the email address and type
            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
            .withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType);

    /*
     * Demonstrates a yield point. At the end of this insert, the batch operation's thread
     * will yield priority to other threads. Use after every set of operations that affect a
     * single contact, to avoid degrading performance.
     */
    op.withYieldAllowed(true);

    // Builds the operation and adds it to the array of operations
    ops.add(op.build());

Son snippet'te, yeni ham kişi ve veri satırlarını ekleyen applyBatch() çağrısı gösterilmektedir.

Kotlin

    // Ask the Contacts Provider to create a new contact
    Log.d(TAG, "Selected account: ${mSelectedAccount.name} (${mSelectedAccount.type})")
    Log.d(TAG, "Creating contact: $name")

    /*
     * Applies the array of ContentProviderOperation objects in batch. The results are
     * discarded.
     */
    try {
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops)
    } catch (e: Exception) {
        // Display a warning
        val txt: String = getString(R.string.contactCreationFailure)
        Toast.makeText(applicationContext, txt, Toast.LENGTH_SHORT).show()

        // Log exception
        Log.e(TAG, "Exception encountered while inserting contact: $e")
    }
}

Java

    // Ask the Contacts Provider to create a new contact
    Log.d(TAG,"Selected account: " + selectedAccount.getName() + " (" +
            selectedAccount.getType() + ")");
    Log.d(TAG,"Creating contact: " + name);

    /*
     * Applies the array of ContentProviderOperation objects in batch. The results are
     * discarded.
     */
    try {

            getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {

            // Display a warning
            Context ctx = getApplicationContext();

            CharSequence txt = getString(R.string.contactCreationFailure);
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(ctx, txt, duration);
            toast.show();

            // Log exception
            Log.e(TAG, "Exception encountered while inserting contact: " + e);
    }
}

Toplu işlemler, iyimser eşzamanlılık kontrolünü uygulamanızı sağlar. temel depoyu kilitlemeden değişiklik işlemleri uygulama yöntemidir. Bu yöntemi kullanmak için işlemi uygular ve ardından aynı anda yapılmış olabilecek diğer değişiklikleri kontrol edersiniz. Tutarsız bir değişiklik yapıldığını tespit ederseniz işleminizi geri alıp yeniden deneyebilirsiniz.

İyimser eşzamanlılık denetimi, aynı anda yalnızca bir kullanıcının bulunduğu ve veri deposuna eşzamanlı erişimlerin nadir olduğu mobil cihazlar için kullanışlıdır. Kilitleme kullanılmadığından, kilit ayarlamak veya diğer işlemlerin kilitlerini açmasını beklemek için zaman harcanmaz.

Tek bir öğeyi güncellerken iyimser eşzamanlılık kontrolü kullanmak için ContactsContract.RawContacts satırında aşağıdaki adımları uygulayın:

  1. Ham kişinin VERSION öğesini al sütunuyla birlikte aldığınız diğer verileri görürsünüz.
  2. Şunun için uygun bir ContentProviderOperation.Builder nesnesi oluşturun: yöntemini kullanarak newAssertQuery(Uri). İçerik URI'si için RawContacts.CONTENT_URI kullan işlenmemiş kişinin _ID etiketi eklenmiş olur.
  3. ContentProviderOperation.Builder nesnesi için VERSION sütununu az önce aldığınız sürüm numarasıyla karşılaştırmak üzere withValue() işlevini çağırın.
  4. Aynı ContentProviderOperation.Builder için, bu iddianın yalnızca bir satırı test etmesini sağlamak amacıyla withExpectedCount() işlevini çağırın.
  5. Oluşturmak için build() ContentProviderOperation nesnesini tanımlayın, ardından bu nesneyi ArrayList içindeki ilk nesne applyBatch().
  6. Toplu işlemi uygulayın.

Ham kişi satırı, satırı okuduğunuz zaman ile satırı okuduğunuz zaman arasında başka bir işlemle güncellenirse bu "sorumluluk" kısmında, ContentProviderOperation. başarısız olur ve tüm işlemler yedeklenir. Sonrasında yeniden deneyebilirsiniz karar verebilir veya başka bir işlem yapabilirsiniz.

Aşağıdaki snippet'te bir "iddia"nın nasıl oluşturulacağı gösterilmektedir Tek bir ham kişi için sorgu yaptıktan sonra ContentProviderOperation CursorLoader:

Kotlin

/*
 * The application uses CursorLoader to query the raw contacts table. The system calls this method
 * when the load is finished.
 */
override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor) {
    // Gets the raw contact's _ID and VERSION values
    rawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID))
    mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION))
}

...

// Sets up a Uri for the assert operation
val rawContactUri: Uri = ContentUris.withAppendedId(
        ContactsContract.RawContacts.CONTENT_URI,
        rawContactID
)

// Creates a builder for the assert operation
val assertOp: ContentProviderOperation.Builder =
        ContentProviderOperation.newAssertQuery(rawContactUri).apply {
            // Adds the assertions to the assert operation: checks the version
            withValue(SyncColumns.VERSION, mVersion)

            // and count of rows tested
            withExpectedCount(1)
        }

// Creates an ArrayList to hold the ContentProviderOperation objects
val ops = arrayListOf<ContentProviderOperation>()

ops.add(assertOp.build())

// You would add the rest of your batch operations to "ops" here

...

// Applies the batch. If the assert fails, an Exception is thrown
try {
    val results: Array<ContentProviderResult> = contentResolver.applyBatch(AUTHORITY, ops)
} catch (e: OperationApplicationException) {
    // Actions you want to take if the assert operation fails go here
}

Java

/*
 * The application uses CursorLoader to query the raw contacts table. The system calls this method
 * when the load is finished.
 */
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

    // Gets the raw contact's _ID and VERSION values
    rawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
    mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION));
}

...

// Sets up a Uri for the assert operation
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactID);

// Creates a builder for the assert operation
ContentProviderOperation.Builder assertOp = ContentProviderOperation.newAssertQuery(rawContactUri);

// Adds the assertions to the assert operation: checks the version and count of rows tested
assertOp.withValue(SyncColumns.VERSION, mVersion);
assertOp.withExpectedCount(1);

// Creates an ArrayList to hold the ContentProviderOperation objects
ArrayList ops = new ArrayList<ContentProviderOperation>;

ops.add(assertOp.build());

// You would add the rest of your batch operations to "ops" here

...

// Applies the batch. If the assert fails, an Exception is thrown
try
    {
        ContentProviderResult[] results =
                getContentResolver().applyBatch(AUTHORITY, ops);

    } catch (OperationApplicationException e) {

        // Actions you want to take if the assert operation fails go here
    }

Niyetlerle getirme ve değiştirme

Cihazın kişiler uygulamasına intent gönderdiğinizde Kişiler'e erişebilirsiniz. dolaylı yoldan. Amaç, cihazın kişiler uygulamasının kullanıcı arayüzünü başlatır. Kullanıcılar burada kişilerle ilgili işler yapabilir. Bu erişim türüyle kullanıcılar şunları yapabilir:

  • Listeden bir kişi seçin ve daha fazla işlem yapmak üzere uygulamanıza geri gelmesini sağlayın.
  • Mevcut bir kişinin verilerini düzenleyin.
  • Hesaplarından herhangi biri için yeni bir ham kişi ekleyin.
  • Bir kişiyi veya kişi verilerini silme.

Kullanıcı veri ekliyor veya güncelliyorsa verileri önce toplayabilir ve intent'in bir parçası olarak gönderebilirsiniz.

Cihazın kişiler uygulaması aracılığıyla Kişiler Sağlayıcısına erişmek için intent'leri kullandığınızda sağlayıcıya erişmek için kendi kullanıcı arayüzünüzü veya kodunuzu yazmanız gerekmez. Ayrıca sağlayıcıya okuma veya yazma izni isteyebilir. Cihazın kişiler uygulaması, bir kişinin okuma iznini size devredebilir. Sağlayıcıda başka bir uygulama üzerinden değişiklik yaptığınız için yazma izinlerine sahip olmanız gerekmez.

Bir sağlayıcıya erişmek için intent göndermeyle ilgili genel süreç "Amaçlar aracılığıyla veri erişimi" bölümündeki İçerik Sağlayıcı ile ilgili temel bilgiler kılavuzu. Mevcut görevler için kullandığınız işlem, MIME türü ve veri değerleri Tablo 4'te özetlenmiştir. putExtra() ile kullanabileceğiniz ekstra değerler ise ContactsContract.Intents.Insert'e ait referans dokümanlarında listelenmiştir:

Tablo 4. Kişi Sağlayıcı Amaçları.

Görev İşlem Veri MIME türü Notlar
Listeden kişi seçme ACTION_PICK Şunlardan biri: Kullanılmadı Şuna bağlı olarak ham kişilerin listesini veya ham kişiden veri listesini görüntüler içerik URI'si türünü seçin.

Telefonla arama startActivityForResult(), bu değer, seçilen satırın içerik URI'sini döndürür. URI'nın biçimi LOOKUP_ID öğesinin eklendiği tablonun içerik URI'si. Cihazın kişiler uygulaması, bu içerik URI'sine okuma ve yazma izinleri verir değişiklik yapmanız gerekmez. Daha fazla bilgi için İçerik Sağlayıcılarla ilgili temel bilgiler kılavuzunu inceleyin.

Yeni ham kişi ekleme Insert.ACTION Yok RawContacts.CONTENT_TYPE, işlenmemiş kişiler grubu için MIME türü. Cihazın kişiler uygulamasının Kişi Ekle ekranını görüntüler. Intent'e eklediğiniz ek değerler gösterilir. startActivityForResult() ile gönderilirse, yeni eklenen ham kişinin içerik URI'si, etkinliğinizin onActivityResult() geri çağırma yöntemine, Intent bağımsız değişkenindeki "data" alanına iletilir. Değeri öğrenmek için getData() numaralı telefonu arayın.
Kişileri düzenleme ACTION_EDIT Şunun için CONTENT_LOOKUP_URI: iletişim kuracaktır. Düzenleyici etkinliği, kullanıcının bu kişiyle ilişkili tüm verileri düzenlemesine olanak tanır. Contacts.CONTENT_ITEM_TYPE, tek bir kişi. Kişiler uygulamasında Kişi Düzenle ekranını görüntüler. Intent'e eklediğiniz ek değerler gösterilir. Kullanıcı Bitti'yi tıklayarak düzenlemezseniz etkinliğiniz ön plana geri döner.
Veri de ekleyebilen bir seçici gösterin. ACTION_INSERT_OR_EDIT Yok CONTENT_ITEM_TYPE Bu intent her zaman kişiler uygulamasının seçici ekranını gösterir. Kullanıcı şunlardan birini yapabilir: düzenlemek için bir kişi seçin veya yeni bir kişi ekleyin. Düzenleme veya ekleme ekranı kullanıcının tercihine bağlı olarak ve satın alma amacında aktardığınız ekstra verilere bağlı olarak gösterilir. Uygulamanız e-posta veya telefon numarası gibi iletişim verilerini gösteriyorsa kullanıcının verileri mevcut bir kişiye eklemesine izin vermek için bu intent'i kullanın. iletişim,

Not: Bu intent'in ekstralarında bir ad değeri göndermenize gerek yoktur. çünkü kullanıcı her zaman mevcut bir adı seçer veya yeni bir ad ekler. Ayrıca, bir ad gönderirseniz ve kullanıcı düzenleme yapmayı seçerse kişiler uygulaması, gönderdiğiniz adı gösterir ve önceki değerin üzerine yazar. Kullanıcı bunu fark etmezse ve düzenlemeyi kaydederse eski değer kaybolur.

Cihazın kişi uygulaması, ham bir kişiyi veya verilerini bir intent ile silmenize izin vermez. Bunun yerine, ham kişiyi silmek için ContentResolver.delete(). veya ContentProviderOperation.newDelete().

Aşağıdaki snippet'te, yeni bir RAW ekleyen intent'in nasıl oluşturulacağı ve gönderileceği gösterilmektedir kişi ve veriler:

Kotlin

// Gets values from the UI
val name = contactNameEditText.text.toString()
val phone = contactPhoneEditText.text.toString()
val email = contactEmailEditText.text.toString()

val company = companyName.text.toString()
val jobtitle = jobTitle.text.toString()

/*
 * Demonstrates adding data rows as an array list associated with the DATA key
 */

// Defines an array list to contain the ContentValues objects for each row
val contactData = arrayListOf<ContentValues>()

/*
 * Defines the raw contact row
 */

// Sets up the row as a ContentValues object
val rawContactRow = ContentValues().apply {
    // Adds the account type and name to the row
    put(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.type)
    put(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.name)
}

// Adds the row to the array
contactData.add(rawContactRow)

/*
 * Sets up the phone number data row
 */

// Sets up the row as a ContentValues object
val phoneRow = ContentValues().apply {
    // Specifies the MIME type for this data row (all data rows must be marked by their type)
    put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)

    // Adds the phone number and its type to the row
    put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
}

// Adds the row to the array
contactData.add(phoneRow)

/*
 * Sets up the email data row
 */

// Sets up the row as a ContentValues object
val emailRow = ContentValues().apply {
    // Specifies the MIME type for this data row (all data rows must be marked by their type)
    put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)

    // Adds the email address and its type to the row
    put(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
}

// Adds the row to the array
contactData.add(emailRow)

// Creates a new intent for sending to the device's contacts application
val insertIntent = Intent(ContactsContract.Intents.Insert.ACTION).apply {
    // Sets the MIME type to the one expected by the insertion activity
    type = ContactsContract.RawContacts.CONTENT_TYPE

    // Sets the new contact name
    putExtra(ContactsContract.Intents.Insert.NAME, name)

    // Sets the new company and job title
    putExtra(ContactsContract.Intents.Insert.COMPANY, company)
    putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle)

    /*
    * Adds the array to the intent's extras. It must be a parcelable object in order to
    * travel between processes. The device's contacts app expects its key to be
    * Intents.Insert.DATA
    */
    putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData)
}

// Send out the intent to start the device's contacts app in its add contact activity.
startActivity(insertIntent)

Java

// Gets values from the UI
String name = contactNameEditText.getText().toString();
String phone = contactPhoneEditText.getText().toString();
String email = contactEmailEditText.getText().toString();

String company = companyName.getText().toString();
String jobtitle = jobTitle.getText().toString();

// Creates a new intent for sending to the device's contacts application
Intent insertIntent = new Intent(ContactsContract.Intents.Insert.ACTION);

// Sets the MIME type to the one expected by the insertion activity
insertIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

// Sets the new contact name
insertIntent.putExtra(ContactsContract.Intents.Insert.NAME, name);

// Sets the new company and job title
insertIntent.putExtra(ContactsContract.Intents.Insert.COMPANY, company);
insertIntent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle);

/*
 * Demonstrates adding data rows as an array list associated with the DATA key
 */

// Defines an array list to contain the ContentValues objects for each row
ArrayList<ContentValues> contactData = new ArrayList<ContentValues>();


/*
 * Defines the raw contact row
 */

// Sets up the row as a ContentValues object
ContentValues rawContactRow = new ContentValues();

// Adds the account type and name to the row
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_TYPE, selectedAccount.getType());
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_NAME, selectedAccount.getName());

// Adds the row to the array
contactData.add(rawContactRow);

/*
 * Sets up the phone number data row
 */

// Sets up the row as a ContentValues object
ContentValues phoneRow = new ContentValues();

// Specifies the MIME type for this data row (all data rows must be marked by their type)
phoneRow.put(
        ContactsContract.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
);

// Adds the phone number and its type to the row
phoneRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);

// Adds the row to the array
contactData.add(phoneRow);

/*
 * Sets up the email data row
 */

// Sets up the row as a ContentValues object
ContentValues emailRow = new ContentValues();

// Specifies the MIME type for this data row (all data rows must be marked by their type)
emailRow.put(
        ContactsContract.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
);

// Adds the email address and its type to the row
emailRow.put(ContactsContract.CommonDataKinds.Email.ADDRESS, email);

// Adds the row to the array
contactData.add(emailRow);

/*
 * Adds the array to the intent's extras. It must be a parcelable object in order to
 * travel between processes. The device's contacts app expects its key to be
 * Intents.Insert.DATA
 */
insertIntent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData);

// Send out the intent to start the device's contacts app in its add contact activity.
startActivity(insertIntent);

Veri bütünlüğü

Kişi deposu, kullanıcıların görmeyi beklediği önemli ve hassas veriler içerdiği için Kişiler Sağlayıcısı’nın veri bütünlüğü için iyi tanımlanmış kuralları vardır. Kişi verilerini değiştirirken bu kurallara uymak sizin sorumluluğunuzdadır. Önemli kuralları burada listelenmiştir:

Eklediğiniz her ContactsContract.RawContacts satırı için daima bir ContactsContract.CommonDataKinds.StructuredName satırı ekleyin.
. Bir ContactsContract.RawContacts satırında bir ContactsContract.CommonDataKinds.StructuredName satır, ContactsContract.Data tablosu, toplamıdır.
Yeni ContactsContract.Data satırlarını her zaman ana ContactsContract.RawContacts satırlarına bağlayın.
ContactsContract.RawContacts'ye bağlı olmayan bir ContactsContract.Data satırı, cihazın kişiler uygulamasında görünmez ve senkronizasyon bağdaştırıcılarında sorunlara neden olabilir.
Yalnızca size ait olan ham kişilerin verilerini değiştirin.
. Kişiler Sağlayıcısı'nın genellikle birden fazla farklı müşteriden verileri yönettiğini hesap türleri/çevrimiçi hizmetler. Uygulamanızın yalnızca size ait satırlardaki verileri değiştirdiğinden veya sildiğinden ve yalnızca kontrol ettiğiniz hesap türünde ve adında veri eklediğinden emin olmanız gerekir.
Yetkililer, içerik URI'leri, URI yolları, sütun adları, MIME türleri ve TYPE değerleri için her zaman ContactsContract ve alt sınıflarında tanımlanan sabitleri kullanın.
Bu sabitleri kullanmak, hataları önlemenize yardımcı olur. Sabitlerden herhangi birinin desteği sonlandırılırsa derleyici uyarılarıyla da bilgilendirilirsiniz.

Özel veri satırları

Kendi özel MIME türlerinizi oluşturup kullanarak ContactsContract.Data tablosuna kendi veri satırlarınızı ekleyebilir, düzenleyebilir, silebilir ve alabilirsiniz. Satırlarınız, ContactsContract.DataColumns içinde tanımlanan sütunu kullanmakla sınırlıdır. Bununla birlikte, kendi türe özgü sütun adlarınızı varsayılan sütun adlarıyla eşleyebilirsiniz. Cihazın kişiler uygulamasında satırlarınızın verileri görüntülenir ancak düzenlenemez veya silinemez ve kullanıcılar ek veriler. Kullanıcıların özel veri satırlarınızı değiştirmesine izin vermek için bir düzenleyici sağlamanız gerekir etkinliğinden yararlanabilirsiniz.

Özel verilerinizi görüntülemek için şunları içeren bir contacts.xml dosyası sağlayın: <ContactsAccountType> öğesi ve bir veya daha fazlası <ContactsDataKind> alt öğesi. Bu konu <ContactsDataKind> element bölümünde daha ayrıntılı olarak açıklanmıştır.

Özel MIME türleri hakkında daha fazla bilgi için şu makaleyi okuyun: İçerik Sağlayıcı Oluşturma kılavuzu.

Kişi Sağlayıcı senkronizasyon adaptörleri

Kişi Sağlayıcı, senkronizasyon bir cihaz ile çevrimiçi bir hizmet arasındaki kişi verileri. Bu sayede kullanıcılar mevcut verileri yeni bir cihaza indirebilir ve yeni bir hesaba yükleyebilir. Senkronizasyon ayrıca bağımsız olarak tüm kullanıcıların en son verilere sahip olmasını sağlar. net bir fikre sahip olabiliyorsunuz. Senkronizasyonun başka bir avantajı da Cihaz ağa bağlı olmadığında bile kullanılabilir kişi verileri.

Senkronizasyonu çeşitli şekillerde uygulayabilirsiniz ancak Android sistemi aşağıdaki görevleri otomatikleştiren bir eklenti senkronizasyon çerçevesi sağlar:

  • Ağ kullanılabilirliği kontrol ediliyor.
  • Kullanıcı tercihlerine göre senkronizasyonu planlama ve yürütme.
  • Durdurulan senkronizasyonları yeniden başlatma.

Bu çerçeveyi kullanmak için bir senkronizasyon bağdaştırıcısı eklentisi sağlarsınız. Her senkronizasyon bağdaştırıcısı hizmet ve içerik sağlayıcı ancak aynı hizmet için birden fazla hesap adı işleyebilir. İlgili içeriği oluşturmak için kullanılan çerçeve, aynı servis ve sağlayıcı için birden fazla senkronizasyon bağdaştırıcısı da kullanmanıza olanak tanır.

Bağdaştırıcı sınıflarını ve dosyaları senkronize etme

AbstractThreadedSyncAdapter sınıfının alt sınıfı olarak bir senkronizasyon bağdaştırıcısı uygulayıp bunu bir Android uygulamasının parçası olarak yüklersiniz. Sistem, uygulamanızdaki öğelerden senkronizasyon bağdaştırıcısı hakkında bilgi edinir manifesto ile işaret edilen özel bir XML dosyasından oluşturun. XML dosyası, çevrimiçi hizmetin hesap türünü ve içerik sağlayıcının yetkisini tanımlar. Bu iki bilgi birlikte bağdaştırıcının benzersiz bir şekilde tanımlanmasını sağlar. Kullanıcı, senkronizasyon bağdaştırıcısı için hesap türüne uygun bir hesap ekleyip senkronizasyon bağdaştırıcısı ile senkronize edilen içerik sağlayıcı için senkronizasyonu etkinleştirene kadar senkronizasyon bağdaştırıcısı etkin olmaz. Bu noktada sistem, bağdaştırıcıyı yönetmeye başlar ve bu çağrıya, içerik sağlayıcı ile sunucu arasında senkronizasyon için gerektiğinde çağrı yapabilir.

Not: Senkronizasyon bağdaştırıcının kimliğinin bir parçası olarak hesap türü kullanılması, sistemin aynı kuruluştaki farklı hizmetlere erişen senkronizasyon bağdaştırıcılarını algılayıp gruplandırmasına olanak tanır. Örneğin, Google çevrimiçi hizmetlerinin senkronizasyon bağdaştırıcılarının tümü hesap türü: com.google. Kullanıcılar cihazlarına bir Google Hesabı eklediğinde, Google hizmetleri için yüklenen tüm senkronizasyon bağdaştırıcılar birlikte listelenir. Listelenen her senkronizasyon bağdaştırıcısı, cihazdaki farklı bir içerik sağlayıcıyla senkronize edilir.

Çoğu hizmette kullanıcıların erişimden önce kimliklerini doğrulaması gerektiği için Android sistemi de buna benzer bir kimlik doğrulama çerçevesi sunar ve ve senkronizasyon bağdaştırıcısı çerçevesiyle birlikte kullanılır. Kimlik doğrulama çerçevesi eklenti kimlik doğrulayıcıları, AbstractAccountAuthenticator Kimlik doğrulayıcı, kullanıcının kimliğini aşağıdaki adımlarda doğrular:

  1. Kullanıcının adını, şifresini veya benzer bilgilerini (kullanıcının kimlik bilgileri).
  2. Kimlik bilgilerini hizmete gönderir
  3. Hizmetin yanıtını inceler.

Hizmet, kimlik bilgilerini kabul ederse kimlik doğrulayıcı kimlik bilgilerini daha sonra kullanmak üzere depolama. Eklenti kimlik doğrulayıcı çerçevesi sayesinde AccountManager, bir kimlik doğrulayıcının desteklediği ve göstermeyi seçtiği tüm kimlik doğrulama jetonlarına (ör. OAuth2 kimlik doğrulama jetonları) erişim sağlayabilir.

Kimlik doğrulama gerekmese de çoğu kişi hizmeti bu yöntemi kullanır. Ancak kimlik doğrulama için Android kimlik doğrulama çerçevesini kullanmanız gerekmez.

Senkronizasyon adaptörü uygulaması

Kişiler Sağlayıcı için bir senkronizasyon bağdaştırıcısı uygulamak üzere, aşağıdakileri içeren bir Android uygulaması oluşturarak başlarsınız:

Sistemden gelen isteklere yanıt veren bir Service bileşeni senkronizasyon adaptörüne bağlanma.
Sistem bir senkronizasyon çalıştırmak istediğinde, senkronizasyon bağdaştırıcısı için bir IBinder almak üzere hizmetin onBind() yöntemini çağırır. Bu sayede sistem, bağdaştırıcının yöntemlerine yapılan çapraz işlem çağrıları.
AbstractThreadedSyncAdapter sınıfının somut bir alt sınıfı olarak uygulanan gerçek senkronizasyon adaptörü.
. Bu sınıf, sunucudan veri indirme, cihaz ve çakışmaların çözümü. Adaptörün ana işlevi onPerformSync() yönteminde yapılır. Bu sınıf, tekli bir sınıf olarak örneklenmelidir.
Application alt sınıfı.
Bu sınıf, senkronizasyon bağdaştırıcısı tekil nesnesi için bir fabrika görevi görür. Şunu kullanın: Senkronizasyon bağdaştırıcısını örneklendirmek için onCreate() yöntemi ve statik bir "alıcı" sağlamalıdır single'ı Senkronizasyon bağdaştırıcısının onBind() yöntemi geliştirmenizi sağlar.
İsteğe bağlı: Sistemden gelen kullanıcı kimlik doğrulama isteklerine yanıt veren bir Service bileşeni.
AccountManager, kimlik doğrulama sürecini başlatmak için bu hizmeti başlatır. Hizmetin onCreate() yöntemi, kimlik doğrulayıcı nesnesi. Sistem, uygulamanın senkronizasyon bağdaştırıcısı için bir kullanıcı hesabının kimliğini doğrulamak istediğinde, kimlik doğrulayıcı için IBinder almak üzere hizmetin onBind() yöntemini çağırır. Bu sayede sistem, kimlik doğrulayıcının yöntemlerine gelen çağrıların çapraz işlenmesini sağlayın.
İsteğe bağlı: Somut bir alt sınıf: Şuna ilişkin istekleri işleyen AbstractAccountAuthenticator: kimlik doğrulama.
. Bu sınıf, AccountManager öğesinin çağırdığı yöntemleri sağlar kullanıcının kimlik bilgilerini sunucuyla doğrulamak için kullanılır. Kimlik doğrulama sürecinin ayrıntıları, kullanılan sunucu teknolojisine bağlı olarak büyük ölçüde değişir. Kimlik doğrulama hakkında daha fazla bilgi edinmek için sunucu yazılımınızın dokümanlarına göz atmanız gerekir.
Sistemin senkronizasyon bağdaştırıcısını ve kimlik doğrulayıcısını tanımlayan XML dosyaları.
. Daha önce açıklanan senkronizasyon bağdaştırıcısı ve kimlik doğrulayıcı hizmet bileşenleri şunlardır: şurada tanımlandığı: <service> öğeleri eklemeliyiz. Bu öğeler içerir <meta-data>. sisteme belirli veriler sağlayan alt öğeler içerir:
  • Senkronizasyon bağdaştırıcısı hizmeti için <meta-data> öğesi, res/xml/syncadapter.xml adlı XML dosyasını gösteriyor. Bu dosya da sırasıyla, web hizmeti için Kişiler Sağlayıcı ile senkronize edilecek bir URI ve web hizmeti için bir hesap türünü belirtir.
  • İsteğe bağlı: Kimlik doğrulayıcının <meta-data> öğesi, res/xml/authenticator.xml XML dosyasını gösterir. Sonuç olarak, bu dosya destekleyen kullanıcı arayüzü kaynaklarının yanı sıra görünür. Bu dokümanda belirtilen hesap türü öğesi, senkronizasyon için belirtilen hesap türüyle aynı olmalıdır adaptörü kullanabilirsiniz.

Sosyal medya akışı verileri

android.provider.ContactsContract.StreamItems ve android.provider.ContactsContract.StreamItemPhotos tabloları, sosyal ağlardan gelen verileri yönetir. Akış verileri ekleyen bir senkronizasyon bağdaştırıcısı yazabilirsiniz kullanabilir veya bu tablolardan akış verilerini okuyabilir ve bu tablolara veya her ikisinde birden gösterebilirsiniz. Bu özellikler sayesinde sosyal ağ hizmetleriniz ve uygulamalarınız Android'in sosyal ağ deneyimine entegre edilebilir.

Sosyal medya akış metni

Akış öğeleri her zaman ham kişiyle ilişkilendirilir. İlgili içeriği oluşturmak için kullanılan android.provider.ContactsContract.StreamItemsSütunlar#RAW_CONTACT_ID, Ham kişi için _ID değeri. Ham verinin hesap türü ve hesap adı kişisi de akış öğesi satırında depolanır.

Akışınızdaki verileri aşağıdaki sütunlarda depolayın:

android.provider.ContactsContract.StreamItemsSütunlar#ACCOUNT_TYPE
Zorunlu. Bu akış öğesiyle ilişkili ham kişi için kullanıcının hesap türü. Akış öğesi eklerken bu değeri ayarlamayı unutmayın.
android.provider.ContactsContract.StreamItemsSütunlar#HESAP_ADI
Zorunlu. Bu akış öğesiyle ilişkili ham kişi için kullanıcının hesap adı. Akış öğesi eklerken bu değeri ayarlamayı unutmayın.
Tanımlayıcı sütunları
Zorunlu. Akış öğesi eklerken aşağıdaki tanımlayıcılar sütunlarını eklemeniz gerekir:
  • android.provider.ContactsContract.StreamItemsColumns#CONTACT_ID: Bu akış öğesinin ilişkili olduğu kişinin android.provider.BaseColumns#_ID değeri.
  • android.provider.ContactsContract.StreamItemsSütunlar#CONTACT_LOOKUP_KEY: android.provider.ContactsContract.ContactsColumn#LOOKUP_KEY bu akış öğesinin ilişkilendirildiği kişi ile bağlantı kurun.
  • android.provider.ContactsContract.StreamItemsColumns#RAW_CONTACT_ID: Bu akış öğesinin ilişkili olduğu ham kişinin android.provider.BaseColumns#_ID değeri.
android.provider.ContactsContract.StreamItemsColumns#COMMENTS
. İsteğe bağlıdır. Bir akış öğesinin başında gösterebileceğiniz özet bilgileri depolar.
android.provider.ContactsContract.StreamItemsColumns#TEXT
Akış öğesinin metni, öğenin kaynağı tarafından yayınlanan içerik veya akış öğesini oluşturan işlemin açıklaması. Bu sütunda, fromHtml() tarafından oluşturulabilen tüm biçimlendirmeler ve yerleşik kaynak resimleri bulunabilir. Sağlayıcı bu bilgilerin ancak etiketlerin kırılmasını önlemeye çalışır.
android.provider.ContactsContract.StreamItemsColumns#TIMESTAMP
Yayın öğesinin eklenme veya güncellenme zamanını içeren bir metin dizesi. Bu dize, başlangıç zamanından itibaren milisaniye cinsindendir. Akış öğeleri ekleyen veya güncelleyen uygulamalar bu sütunun korunmasından sorumludur. Bu sütun, Kişi Sağlayıcı tarafından otomatik olarak korunmaz.

Akış öğelerinizle ilgili tanımlayıcı bilgileri göstermek için android.provider.ContactsContract.StreamItemsSütunlar#RES_icon android.provider.ContactsContract.StreamItemsSütunlar#RES_LABEL ve Kaynaklara bağlantı oluşturmak için android.provider.ContactsContract.StreamItemsSütunlar#RES_PACKAGE tercih edebilirsiniz.

android.provider.ContactsContract.StreamItems tablosu, senkronizasyon bağdaştırıcılarına özel olarak kullanılan android.provider.ContactsContract.StreamItemsColumns#SYNC1 ile android.provider.ContactsContract.StreamItemsColumns#SYNC4 arasındaki sütunları da içerir.

Sosyal akış fotoğrafları

android.provider.ContactsContract.StreamItemPhotos tablosu, ilişkilendirilen fotoğrafları depolar. akış öğesiyle test edin. Tablonun android.provider.ContactsContract.StreamItemPhotosSütunlar#STREAM_ITEM_ID sütunu şunun _ID sütunundaki değerlere bağlantı verir: android.provider.ContactsContract.StreamItems tablosu. Fotoğraf referansları şu sütunlarda tabloda depolanır:

android.provider.ContactsContract.StreamItemPhotos#PHOTO sütunu (bir BLOB).
Fotoğrafın, depolama ve görüntüleme için sağlayıcı tarafından yeniden boyutlandırılmış ikili gösterimi. Bu sütun, fotoğrafları depolamak için kullanan Kişi Sağlayıcı'nın önceki sürümleriyle geriye dönük uyumluluk için kullanılabilir. Ancak mevcut sürümde fotoğraf depolamak için bu sütunu kullanmamanız gerekir. Bunun yerine android.provider.ContactsContract.StreamItemPhotosColumn#PHOTO_FILE_ID veya android.provider.ContactsContract.StreamItemPhotosColumn#PHOTO_URI (her ikisi (aşağıdaki noktalarda açıklanmıştır) ekleyebilirsiniz. Bu sütun artık fotoğrafın okunabilir bir küçük resmi vardır.
android.provider.ContactsContract.StreamItemPhotosColumn#PHOTO_FILE_ID
. Ham bir kişi için fotoğrafın sayısal tanımlayıcısı. Bu değeri sabite ekleyin DisplayPhoto.CONTENT_URI. tek bir fotoğraf dosyasına işaret eden içerik URI'si almak ve ardından Fotoğraf dosyasını herkese açık kullanıcı adı olarak ayarlamak için openAssetFileDescriptor().
android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_URI
Bu satır tarafından temsil edilen fotoğrafın fotoğraf dosyasını doğrudan işaret eden bir içerik URI'si. Fotoğraf dosyasının adını almak için bu URI ile openAssetFileDescriptor() işlevini çağırın.

Sosyal akış tablolarını kullanma

Bu tablolar, aşağıdakiler dışında Kişi Sağlayıcı'daki diğer ana tablolarla aynı şekilde çalışır:

  • Bu tablolar için ek erişim izinleri gerekir. Bunları okuyabilmek için uygulamanız android.Manifest.permission#READ_SOCIAL_STREAM iznine sahip olmalıdır. Alıcı: bunları değiştirmeniz gerekiyorsa, uygulamanızın android.Manifest.permission#WRITE_SOCIAL_STREAM.
  • android.provider.ContactsContract.StreamItems tablosunda satır sayısı her ham kişi için depolama sınırı uygulanır. Bu sınıra ulaşıldığında, Kişi Sağlayıcı, verileri otomatik olarak silerek yeni akış öğesi satırları için yer açar en eski satıra sahip satırlar android.provider.ContactsContract.StreamItemsSütunlar#TIMESTAMP. To almak için limit, içerik URI'sine bir sorgu gönderin android.provider.ContactsContract.StreamItems#CONTENT_LIMIT_URI. Ayrılabilirsiniz içerik URI'si dışındaki tüm bağımsız değişkenler null olarak ayarlanmış. Sorgu, android.provider.ContactsContract.StreamItems#MAX_ITEMS tek sütunlu tek bir satır içeren bir imleç döndürür.

android.provider.ContactsContract.StreamItems.StreamItemPhotos sınıfı, tek bir akış öğesinin fotoğraf satırlarını içeren android.provider.ContactsContract.StreamItemPhotos alt tablosunu tanımlar.

Sosyal medya akışı etkileşimleri

Kişi Sağlayıcı tarafından yönetilen sosyal akış verileri, cihazın kişi uygulamasıyla birlikte sosyal ağ sisteminizi mevcut kişilerle bağlamanın güçlü bir yolunu sunar. Aşağıdaki özellikler kullanılabilir:

  • Sosyal ağ hizmetinizi bir senkronizasyon bağdaştırıcısı ile Kişiler Sağlayıcısı ile senkronize ederek kullanıcının kişilerinin son etkinliğini alıp daha sonra kullanmak üzere android.provider.ContactsContract.StreamItems ve android.provider.ContactsContract.StreamItemPhotos tablolarında saklayabilirsiniz.
  • Düzenli senkronizasyonun yanı sıra, kullanıcı görüntülemek için bir kişi seçtiğinde senkronizasyon bağdaştırıcınızı ek verileri almak için tetikleyebilirsiniz. Bu sayede senkronizasyon bağdaştırıcınız, ilgili kişi için yüksek çözünürlüklü fotoğrafları ve en son akış öğelerini alabilir.
  • Cihazın kişiler uygulaması ve Kişiler Sağlayıcı, bir kişi görüntülendiğinde niyet alabilirsiniz ve bu noktada hizmetinizde kişinin durumunu güncelleyebilir. Bu yaklaşım daha hızlı olabilir ve daha az senkronizasyon bağdaştırıcısıyla tam senkronizasyon yapmaya kıyasla daha fazla bant genişliğine karşılık gelir.
  • Kullanıcılar bu kişiye bakarken sosyal ağ hizmetinize bir kişi ekleyebilir cihazındaki kişiler uygulamasında. Bu özelliği, "kişiyi davet et" özelliğiyle etkinleştirirsiniz. Bu özelliği, mevcut bir kişiyi ağınıza ekleyen bir etkinliğin ve cihazın kişi uygulamasına ve Kişi Sağlayıcı'ya uygulamanızın ayrıntılarını sağlayan bir XML dosyasının bir kombinasyonuyla etkinleştirirsiniz.

Akış öğelerinin Kişi Sağlayıcı ile düzenli senkronizasyonu diğer senkronizasyonlar. Senkronizasyon hakkında daha fazla bilgi edinmek için Kişi Sağlayıcı senkronizasyon bağdaştırıcılar bölümüne bakın. Bildirimleri kaydetme ve kişileri davet etme konuları sonraki iki bölümde ele alınmaktadır.

Sosyal ağ görüntülemelerini işlemek için kaydolun

Senkronizasyon bağdaştırıcınızı, kullanıcı aşağıdaki türde bir kişiyi görüntülediğinde bildirim alacak şekilde kaydetmek için: senkronizasyon bağdaştırıcınız tarafından yönetiliyor:

  1. Projenizin res/xml/ dizininde contacts.xml adlı bir dosya oluşturun. Bu dosyaya zaten sahipseniz bu adımı atlayabilirsiniz.
  2. Bu dosyaya öğeyi <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz.
  3. Kullanıcı bir kişinin ayrıntılar sayfasını cihazın kişiler uygulamasına, Öğeye viewContactNotifyService="serviceclass". Burada serviceclass, hizmetin tam sınıf adıdır cihazdaki kişiler uygulamasından isteği alması gereken kişilerdir. Bildirimci için IntentService öğesini genişleten bir sınıf kullanın ve hizmetin amaç alır. Gelen intent'teki veriler, kullanıcının tıkladığı ham kişinin içerik URI'sini içerir. Bildirimci hizmetinden, ham kişinin verilerini güncellemek için senkronizasyon bağdaştırıcınızı bağlayabilir ve ardından çağırabilirsiniz.

Kullanıcı bir akış öğesini, fotoğrafı ya da her ikisini birden tıkladığında çağrılacak bir etkinlik kaydetmek için:

  1. Projenizin res/xml/ klasöründe contacts.xml adlı bir dosya oluşturun dizin. Bu dosyayı zaten yüklediyseniz bu adımı atlayabilirsiniz.
  2. Bu dosyaya <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> öğesini ekleyin. Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz.
  3. Kullanıcının bir akış öğesini tıklamasını sağlamak üzere etkinliklerinizden birini kaydetmek için cihazındaki kişiler uygulamasına, Öğeye viewStreamItemActivity="activityclass". Burada activityclass, etkinliğin tam sınıf adıdır cihazdaki kişiler uygulamasından isteği alması gereken kişilerdir.
  4. Kullanıcının bir akış fotoğrafını tıklamasını sağlamak için etkinliklerinizden birini kaydetmek cihazındaki kişiler uygulamasına, Öğeye viewStreamItemPhotoActivity="activityclass". Burada activityclass, etkinliğin tam sınıf adıdır cihazdaki kişiler uygulamasından isteği alması gereken kişilerdir.

<ContactsAccountType> öğesi şurada daha ayrıntılı olarak açıklanmaktadır: bölüm <ContactsAccountType> öğesi kullanın.

Gelen intent, kullanıcının tıkladığı öğenin veya fotoğrafın içerik URI'sini içerir. Metin öğeleri ve fotoğraflar için farklı etkinliklere sahip olmak istiyorsanız her iki özelliği aynı dosyada kullanın.

Sosyal ağ hizmetinizle etkileşimde bulunma

Kullanıcıların, kişileri sosyal medya hesaplarınıza davet etmek için cihazın kişiler uygulamasından çıkmaları gerekmez ağ iletişimi sitesi. Bunun yerine, cihazın kişiler uygulamasının kişiyi etkinliklerinizden birine davet etmek için intent göndermesini sağlayabilirsiniz. Bunu ayarlamak için:

  1. Projenizin res/xml/ dizininde contacts.xml adlı bir dosya oluşturun. Bu dosyaya zaten sahipseniz bu adımı atlayabilirsiniz.
  2. Bu dosyaya <ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"> öğesini ekleyin. Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz.
  3. Aşağıdaki özellikleri ekleyin:
    • inviteContactActivity="activityclass"
    • inviteContactActionLabel="@string/invite_action_label"
    activityclass değeri, amacı alması gereken etkinliğin tam nitelikli sınıf adıdır. invite_action_label değeri, cihazın kişiler uygulamasındaki Bağlantı Ekle menüsünde gösterilen bir metin dizesidir.

Not: ContactsSource, ContactsAccountType için kullanımdan kaldırılmış bir etiket adıdır.

contacts.xml referansı

contacts.xml dosyası, senkronizasyon bağdaştırıcınızın ve uygulamanızın kişiler uygulaması ve Kişiler Sağlayıcı ile etkileşimini kontrol eden XML öğelerini içerir. Bu öğeler aşağıdaki bölümlerde açıklanmıştır.

<ContactAccountType> öğe

<ContactsAccountType> öğesi, kişi uygulamasıyla iletişim kuracaksınız. Söz dizimi şu şekildedir:

<ContactsAccountType
        xmlns:android="http://schemas.android.com/apk/res/android"
        inviteContactActivity="activity_name"
        inviteContactActionLabel="invite_command_text"
        viewContactNotifyService="view_notify_service"
        viewGroupActivity="group_view_activity"
        viewGroupActionLabel="group_action_text"
        viewStreamItemActivity="viewstream_activity_name"
        viewStreamItemPhotoActivity="viewphotostream_activity_name">

Şunun içinde yer alır:

res/xml/contacts.xml

şunları içerebilir:

<ContactsDataKind>

Açıklama:

Kullanıcıların kişilerinden birini sosyal ağa davet etmesine, sosyal ağ akışlarından biri güncellendiğinde kullanıcıları bilgilendirmesine vb. olanak tanıyan Android bileşenlerini ve kullanıcı arayüzü etiketlerini tanımlar.

android: özellik önekinin özellikler için gerekli olmadığına dikkat edin / <ContactsAccountType>.

Özellikler:

inviteContactActivity
. Uygulamanızda görmek istediğiniz etkinliğin tam sınıf adı Kullanıcı, cihazın menüsünden Bağlantı ekle'yi seçtiğinde etkinleşir. kişiler uygulamasıdır.
inviteContactActionLabel
. Şurada belirtilen etkinlik için görüntülenen metin dizesi: Bağlantı ekle menüsünde inviteContactActivity. Örneğin, "Ağımda takip et" dizesini kullanabilirsiniz. Bu etiket için bir dize kaynak tanımlayıcısı kullanabilirsiniz.
viewContactNotifyService
Kullanıcı bir kişiyi görüntülediğinde bildirim alması gereken, uygulamanızdaki bir hizmetin tam nitelikli sınıf adı. Bu bildirim, cihazın kişiler uygulaması tarafından gönderilir ve uygulamanızın, veri yoğun işlemlerini gerektiğinde kadar ertelemesine olanak tanır. Örneğin, uygulamanız bu bildirime yanıt verebilir kişinin yüksek çözünürlüklü ve en son fotoğrafının fotoğrafını okuyup görüntüleyerek sosyal akış öğeleri. Bu özellik, aşağıdaki bölümde daha ayrıntılı olarak açıklanmıştır: Sosyal akış etkileşimleri.
viewGroupActivity
. Uygulamanızda, görüntülenebilecek bir etkinliğin tam sınıf adı grup bilgisi. Kullanıcı, cihazın Kişiler uygulamasında grup etiketini tıkladığında bu etkinliğin kullanıcı arayüzü gösterilir.
viewGroupActionLabel
Kullanıcının uygulamanızdaki gruplara bakmasına olanak tanıyan bir kullanıcı arayüzü denetimi için kişiler uygulamasının gösterdiği etiket.

Bu özellik için bir dize kaynak tanımlayıcısına izin veriliyor.

viewStreamItemActivity
Kullanıcı ham bir kişi için bir akış öğesini tıkladığında cihazın kişi uygulamasının başlattığı, uygulamanızdaki bir etkinliğin tam nitelikli sınıf adı.
viewStreamItemPhotoActivity
Kullanıcı, ham bir kişi için akış öğesindeki bir fotoğrafı tıkladığında cihazın kişi uygulamasının başlattığı, uygulamanızdaki bir etkinliğin tam nitelikli sınıf adı.

<ContactsDataKind> öğe

<ContactsDataKind> öğesi, uygulamanızın kullanıcı arayüzünde özel veri satırları oluşturun. Şu söz dizimine sahiptir:

<ContactsDataKind
        android:mimeType="MIMEtype"
        android:icon="icon_resources"
        android:summaryColumn="column_name"
        android:detailColumn="column_name">

Şu ürünlerde bulunur:

<ContactsAccountType>

Açıklama:

Kişiler uygulamasının, özel bir veri satırının içeriğini aşağıdaki gibi görüntülemesini sağlamak için bu öğeyi kullanın: bir kısmıdır. <ContactsAccountType> öğesinin her <ContactsDataKind> alt öğesi, senkronizasyon bağdaştırıcınızın ContactsContract.Data tablosuna eklediği bir özel veri satırı türünü temsil eder. Kullandığınız her özel MIME türü için bir <ContactsDataKind> öğesi ekleyin. Veri göstermek istemediğiniz özel bir veri satırınız varsa öğeyi eklemeniz gerekmez.

Özellikler:

android:mimeType
. Google Etiket Yöneticisi'ndeki özel veri satırı türlerinden biri için tanımladığınız özel ContactsContract.Data tablo. Örneğin, vnd.android.cursor.item/vnd.example.locationstatus değeri, bir kişinin bilinen son konumunu kaydeden bir veri satırı için özel bir MIME türü olabilir.
android:icon
. Android çekilebilir kaynak görürsünüz. Bunu, dönüşüm hunisinin gelen bir e-posta alırsınız.
android:summaryColumn
Veri satırından alınan iki değerden ilkinin sütun adı. Değer, bu veri satırının girişinin ilk satırı olarak gösterilir. İlk satır kullanılmak üzere hazırlanmış olsa da isteğe bağlıdır. Şu kaynakları da inceleyin android:detailColumn.
android:detailColumn
. Veri satırından alınan iki değerden ikincisi için sütun adı. Değer, bu veri satırının girişinin ikinci satırı olarak gösterilir. Ayrıca android:summaryColumn sayfasını da inceleyin.

Diğer Kişi Sağlayıcı özellikleri

Kişi Sağlayıcı, önceki bölümlerde açıklanan temel özelliklerin yanı sıra kişiler verileriyle çalışmak için aşağıdaki kullanışlı özellikleri de sunar:

  • Kişi grupları
  • Fotoğraf özellikleri

Kişi grupları

Kişi Sağlayıcı, isteğe bağlı olarak ilgili kişi koleksiyonlarını grup verileriyle etiketleyebilir. Bir kullanıcı hesabıyla ilişkili sunucu grupları korumak istiyorsa hesabın hesap türüne ait senkronizasyon bağdaştırıcısı, grup verilerini Kişiler Sağlayıcı ile sunucu arasında aktarmalıdır. Kullanıcılar senkronizasyon bağdaştırıcısının, yeni grubu eklemesi gerekir. ContactsContract.Groups tablosuna gider. Bir ham grubu veya ait olduğu kişi bilgisi kullanılarak ContactsContract.Data tablosunda depolanır ContactsContract.CommonDataKinds.GroupMembership MIME türü.

Sunucudaki ham kişi verilerini Kişi Sağlayıcı'ya ekleyebilecek bir senkronizasyon bağdaştırıcısı tasarlıyorsanız ve grup kullanmıyorsanız sağlayıcıya verilerinizi görünür hale getirmesini söylemeniz gerekir. Kullanıcı hesap eklediğinde yürütülen kodda cihaza yükleyin, ContactsContract.Settings uygulamasını güncelleyin satırı oluşturur. Bu satırda, Settings.UNGROUPED_VISIBLE sütununun değerini 1 olarak ayarlayın. Bunu yaptığınızda Kişi Sağlayıcısı her zaman grupları kullanmasanız bile kişi verilerinizi görünür hale getirebilirsiniz.

Kişi fotoğrafları

ContactsContract.Data tablosu, fotoğrafları Photo.CONTENT_ITEM_TYPE MIME türüyle satır olarak depolar. Satırın CONTACT_ID sütunu ait olduğu ham kişinin _ID sütunu. ContactsContract.Contacts.Photo sınıfı şunun bir alt tablosunu tanımlar: Bir kişinin fotoğraf bilgilerini içeren ContactsContract.Contacts kişinin birincil ham kişisinin birincil fotoğrafı olan birincil fotoğraf. Aynı şekilde, ContactsContract.RawContacts.DisplayPhoto sınıfı bir alt tablo tanımlar bir fotoğrafa ait fotoğraf bilgileri içeren ContactsContract.RawContacts sonuç RAW kişinin birincil fotoğrafı.

ContactsContract.Contacts.Photo ve ContactsContract.RawContacts.DisplayPhoto, şunlara ilişkin örnekler içerir: fotoğraf bilgisi alınıyor. Ham bir kişinin birincil küçük resmini almak için kolaylık sınıfı yoktur ancak ham kişinin birincil fotoğraf satırını bulmak için ham kişinin _ID, Photo.CONTENT_ITEM_TYPE ve IS_PRIMARY sütununu seçerek ContactsContract.Data tablosuna sorgu gönderebilirsiniz.

Bir kişinin sosyal akış verileri fotoğraf da içerebilir. Bunlar şurada saklanır: android.provider.ContactsContract.StreamItemPhotos tablosu hakkında daha fazla bilgi Sosyal akış fotoğrafları bölümünde bulabilirsiniz.