Kişi Sağlayıcısı, cihazın kişiler hakkındaki merkezi veri deposunu yöneten güçlü ve esnek bir Android bileşenidir. Kişi Sağlayıcı, cihazın kişiler uygulamasında gördüğünüz verilerin kaynağıdır. Ayrıca, kendi uygulamanızdan da cihazdaki verilere erişebilir, cihazla online hizmetler arasında veri aktarabilirsiniz. Sağlayıcı çok çeşitli veri kaynaklarını barındırır ve her kullanıcı için mümkün olduğunca fazla veriyi yönetmeye çalışır. Bu durum, organizasyonunun karmaşık hale gelmesine neden olur. Bu nedenle, sağlayıcının API'si hem veri almayı hem de değiştirmeyi kolaylaştıran çok çeşitli sözleşme sınıfları ve arayüzler içerir.
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ı ile senkronize etmek için senkronizasyon bağdaştırıcısı yazma.
Bu kılavuzda, Android içerik sağlayıcılarla ilgili temel bilgilere sahip olduğunuz varsayılmaktadır. Android içerik sağlayıcıları hakkında daha fazla bilgi edinmek için İçerik Sağlayıcı ile ilgili temel bilgiler kılavuzunu okuyun.
Kişi Sağlayıcı kuruluşu
Kişi Sağlayıcı bir Android içerik sağlayıcı bileşenidir. Bir kişi hakkında üç tür veri sağlar. Bunların her biri, Şekil 1'de gösterildiği gibi, sağlayıcının sunduğu bir tabloya karşılık gelir:
![](https://developer.android.google.cn/static/images/providers/contacts_structure.png?authuser=19&hl=tr)
Şekil 1. Kişi Sağlayıcı tablo yapısı.
Bu üç tablo genellikle sözleşmeli sınıfların adlarıyla anılır. Sınıflar; içerik URI'leri, sütun adları ve tablolar tarafından kullanılan sütun değerleri için sabit değerler tanımlar:
-
ContactsContract.Contacts
tablo - Ham kişi satırlarının toplamlarına göre farklı kişileri temsil eden satırlar.
-
ContactsContract.RawContacts
tablo - Bir kullanıcının hesap ve türüne özel verilerinin özetini içeren satırlar.
-
ContactsContract.Data
tablo - E-posta adresleri veya telefon numaraları gibi ham kişinin ayrıntılarını içeren satırlar.
ContactsContract
içinde sözleşme sınıflarıyla temsil edilen diğer tablolar, Kişi Sağlayıcı'nın işlemlerini yönetmek veya cihazın kişiler ya da telefon uygulamalarında belirli işlevleri desteklemek için kullandığı yardımcı tablolardır.
Ham kişiler
Ham kişi, tek bir hesap türü ve hesap adından gelen kullanıcı verilerini temsil eder. Kişi Sağlayıcısı, bir kişinin veri kaynağı olarak birden fazla online hizmete izin verdiğinden, Kişi Sağlayıcı aynı kişi için birden fazla ham kişiye izin verir. Birden fazla ham kişi, bir kullanıcının aynı hesap türüne ait birden fazla hesaptaki kişi verilerini birleştirmesine de olanak tanır.
Ham bir kişiye ait verilerin çoğu ContactsContract.RawContacts
tablosunda depolanmaz. Bunun yerine, ContactsContract.Data
tablosundaki bir veya daha fazla satırda depolanı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 tablo 1'de listelenmiştir. Lütfen tablodan sonra verilen notları okuyun:
Tablo 1. Önemli ham kişi sütunları.
Sütun adı | Kullanım | Notlar |
---|---|---|
ACCOUNT_NAME
|
Bu ham kişinin kaynağı olan hesap türünün hesap adı.
Örneğin, bir Google hesabının hesap adı, cihaz sahibinin Gmail adreslerinden biridir. Daha fazla bilgi için bir sonraki ACCOUNT_TYPE girişine bakın.
|
Bu adın biçimi hesap türüne özgüdür. Bu, bir e-posta adresi değildir. |
ACCOUNT_TYPE
|
Bu ham kişinin kaynağı olan hesap türü. Örneğin, Google Hesabı'nın hesap türü com.google şeklindedir. Hesap türünüzü daima sahip olduğunuz veya kontrol ettiğiniz bir alanın alan tanımlayıcısıyla nitelendirin. Böylece hesap türünüzün benzersiz olması sağlanır.
|
Kişi verilerini sunan bir hesap türü genellikle Kişi Sağlayıcısı ile senkronize edilen ilişkili bir senkronizasyon bağdaştırıcısına sahiptir. |
DELETED
|
Ham kişinin "silindi" işaretidir. | Bu işaret, Kişi Sağlayıcı'nın, senkronizasyon bağdaştırıcıları satırı kendi sunucularından silene ve son olarak da satırı depodan silene kadar satırı dahili olarak korumasına olanak tanır. |
Notlar
Aşağıda ContactsContract.RawContacts
tablosuyla ilgili önemli notlar verilmiştir:
-
Ham kişinin adı,
ContactsContract.RawContacts
içindeki satırında depolanmaz. Bunun yerineContactsContract.Data
tablosunda,ContactsContract.CommonDataKinds.StructuredName
satırında depolanır. Ham kişilerinContactsContract.Data
tablosunda bu türde yalnızca bir satır bulunur. -
Dikkat: Bir ham kişi satırında kendi hesap verilerinizi kullanmak için verilerin önce
AccountManager
'de kayıtlı olması gerekir. Bunun için kullanıcılardan hesap türünü ve hesap adlarını hesap listesine eklemelerini 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ıyla web tabanlı hizmetinize ait kişi verilerini saklamasını istiyorsanız ve kullanıcının hizmetinize ilişkin hesabıbecky.sharp@dataservice.example.com
ise uygulamanızın ham kişi satırları ekleyebilmesi için önce kullanıcının hesap "tür" (com.example.dataservice
) ve hesap "adı" (becky.smart@dataservice.example.com
) bilgilerini eklemesi gerekir. Bu gereksinimi kullanıcıya belgelerde açıklayabilir veya kullanıcıdan türü ve adı ya da her ikisini de eklemesini isteyebilirsiniz. Hesap türleri ve hesap adları, bir sonraki bölümde daha ayrıntılı olarak açıklanmıştır.
Ham kişi verilerinin kaynakları
Ham kişilerin işleyiş şeklini anlamak için cihazında aşağıdaki üç kullanıcı hesabı tanımlanmış "Emily Dickinson" kullanıcısını ele alalım:
emily.dickinson@gmail.com
emilyd@gmail.com
- "belle_of_amherst" Twitter hesabı
Bu kullanıcı, Hesaplar ayarlarında bu hesapların üçü için de Kişileri Senkronize Et'i etkinleştirmiştir.
Emily Dickinson'ın bir tarayıcı penceresi açtığını, emily.dickinson@gmail.com
olarak Gmail'e giriş yaptığını, Kişiler'i açtığını ve "Thomas Higginson"ı eklediğini varsayalım. Daha sonra Gmail'e emilyd@gmail.com
olarak giriş yapar ve "Thomas Higginson"a bir e-posta gönderir. Bu e-posta, kullanıcıyı otomatik olarak kişi olarak ekler. Ayrıca Twitter'da "colonel_tom"u (Thomas Higginson'ın Twitter kimliği) takip ediyor.
Kişi Sağlayıcı bu çalışmanın sonucu olarak üç ham kişi oluşturur:
-
emily.dickinson@gmail.com
ile ilişkili "Thomas Higginson" için ham iletişim kişisi. Kullanıcı hesabı türü Google'dır. -
emilyd@gmail.com
ile ilişkili "Thomas Higginson" için ikinci ham iletişim kişisi. Kullanıcı hesabı türü de Google'dır. İkinci bir ham kişi daha vardır. Ad, önceki adla aynı olsa bile, kişi farklı bir kullanıcı hesabı için eklenmiştir. - "Thomas Higginson" için "belle_of_amherst" ile ilişkili üçüncü ham temas. Kullanıcı hesabı türü Twitter'dır.
Veri
Daha önce belirtildiği gibi, ham kişinin verileri ham kişinin _ID
değerine bağlı bir ContactsContract.Data
satırında depolanır. Bu işlem, tek bir ham kişinin e-posta adresi veya telefon numarası gibi aynı veri türünün birden fazla örneğini olmasını sağlar. Örneğin, emilyd@gmail.com
için "Thomas Higginson" (emilyd@gmail.com
Google hesabıyla ilişkili Thomas Higginson için ham iletişim satırı) ev e-posta adresi thigg@gmail.com
ve iş e-posta adresi thomas.higginson@gmail.com
ise Kişi Sağlayıcı iki e-posta adresi satırını depolar ve ikisini de ham kişiye bağlar.
Bu tek tabloda farklı veri türlerinin depolandığına dikkat edin. Görünen ad, telefon numarası, e-posta, posta adresi, fotoğraf ve web sitesi ayrıntı satırlarının tümü ContactsContract.Data
tablosunda yer alır. Bunu yönetmeye yardımcı olmak için ContactsContract.Data
tablosunda açıklayıcı adlara sahip bazı sütunlar, genel ada sahip bazı sütunlar bulunur. Açıklayıcı ad sütununun içeriği, satırdaki veri türünden bağımsız olarak aynı anlama sahipken genel ad sütununun içerikleri, veri türüne bağlı olarak farklı anlamlara sahiptir.
Açıklayıcı sütun adları
Açıklayıcı sütun adlarına bazı örnekler şöyledir:
-
RAW_CONTACT_ID
-
Bu veriler için ham ilgili 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ı,
ContactsContract.CommonDataKinds
alt sınıflarında tanımlanan MIME türlerini kullanır. Bu MIME türleri açık kaynaklıdır ve Kişi Sağlayıcı ile çalışan herhangi bir uygulama veya senkronizasyon bağdaştırıcısı tarafından kullanılabilir. -
IS_PRIMARY
-
Bu tür bir veri satırı, bir ham kişi için birden fazla kez gerçekleşebilirse
IS_PRIMARY
sütunu, bu tür için birincil verileri içeren veri satırını işaretler. Örneğin, kullanıcı, bir kişinin telefon numarasına uzun basar ve Varsayılan olarak ayarla'yı seçerse bu numarayı içerenContactsContract.Data
satırınınIS_PRIMARY
sütunu sıfır dışında bir değere ayarlanır.
Genel sütun adları
Genel olarak kullanıma açık olan DATA1
-DATA15
adlı 15 genel sütun ve yalnızca senkronizasyon bağdaştırıcıları tarafından kullanılması gereken ek olarak SYNC1
ile SYNC4
arasındaki dört genel sütun vardır. Genel sütun adı sabitleri, satırın içerdiği veri türünden bağımsız olarak her zaman çalışır.
DATA1
sütunu dizine eklendi. Kişi Sağlayıcısı, sağlayıcının bir sorgunun en sık hedefi olmasını beklediği veriler için her zaman bu sütunu kullanır. Örneğin, e-posta satırında bu sütunda gerçek e-posta adresi bulunur.
Genel olarak DATA15
sütunu, fotoğraf küçük resimleri gibi İkili Büyük Nesne (BLOB) verilerini depolamak için ayrılmıştır.
Türe özel sütun adları
Belirli bir satır türünün sütunlarıyla çalışmayı kolaylaştırmak için Kişi Sağlayıcısı, ContactsContract.CommonDataKinds
alt sınıflarında tanımlanan türe özel sütun adı sabitleri de sağlar. Sabit değerler, aynı sütun adına farklı bir sabit ad verir. Bu, belirli bir türdeki bir satırdaki verilere erişmenize yardımcı olur.
Örneğin, ContactsContract.CommonDataKinds.Email
sınıfı, Email.CONTENT_ITEM_TYPE
MIME türüne sahip bir ContactsContract.Data
satırı için türe özel sütun adı sabit değerlerini tanımlar. Sınıf, e-posta adresi sütunu için ADDRESS
sabit değerini içerir. ADDRESS
öğesinin gerçek değeri, sütunun genel adıyla aynı olan "data1"dir.
Dikkat: ContactsContract.Data
tablosuna, sağlayıcının önceden tanımlanmış MIME türlerinden birinin bulunduğu bir satırı kullanarak kendi özel verilerinizi eklemeyin. Aksi takdirde verilerinizi kaybedebilir veya sağlayıcının hatalı çalışmasına neden olabilirsiniz. Örneğin, DATA1
sütununa e-posta adresi yerine kullanıcı adı içeren Email.CONTENT_ITEM_TYPE
MIME türüne sahip bir satır eklememelisiniz. Satır için kendi özel MIME türünüzü kullanıyorsanız kendi türe özel sütun adlarınızı tanımlayabilir ve sütunları istediğiniz gibi kullanabilirsiniz.
Şekil 2'de, açıklayıcı sütunlar ile veri sütunlarının bir ContactsContract.Data
satırında nasıl göründüğü ve türe özel sütun adlarının genel sütun adlarını nasıl "yerleştirdiği" gösterilmektedir
![Türe özel sütun adlarının genel sütun adlarıyla eşleşmesi](https://developer.android.google.cn/static/images/providers/data_columns.png?authuser=19&hl=tr)
2. Şekil. Türe özel sütun adları ve genel sütun adları.
Türe özel sütun adı sınıfları
Tablo 2'de en yaygın kullanılan türe özel sütun adı sınıfları listelenmiştir:
Tablo 2. Türe özel sütun adı sınıfları
Eşleme sınıfı | Veri türü | Notlar |
---|---|---|
ContactsContract.CommonDataKinds.StructuredName |
Bu veri satırıyla ilişkilendirilmiş ham kişinin ad verileri. | Bir ham kişi bu satırlardan yalnızca birine sahip. |
ContactsContract.CommonDataKinds.Photo |
Bu veri satırıyla ilişkili ham kişinin ana fotoğrafı. | Bir ham kişi bu satırlardan yalnızca birine sahip. |
ContactsContract.CommonDataKinds.Email |
Bu veri satırıyla ilişkili 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. | Bir ham 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ü ve hesap adının isteğe bağlı bir özelliğidir. Bunlar, 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ürleri ve hesap adlarındaki ham kişi satırlarını birleştirerek bir kişi oluşturur. Bu, kullanıcının bir kişi için topladığı tüm verilerin görüntülenmesini ve değiştirilmesini kolaylaştırır. 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. Ne uygulamaların ne de senkronizasyon bağdaştırıcılarının kişi eklemesine izin verilmez ve kişi satırındaki bazı sütunlar salt okunurdur.
Not: Kişi Sağlayıcı'ya insert()
ile bir kişi eklemeye çalışırsanız UnsupportedOperationException
istisnası alırsınız. "Salt okunur" olarak listelenen bir sütunu güncellemeye çalışırsanız güncelleme yok sayılır.
Kişi Sağlayıcı, mevcut kişilerle eşleşmeyen yeni bir ham kişi eklenmesi karşılığında yeni bir kişi oluşturur. Sağlayıcı, mevcut bir ham kişinin verileri daha önce ekli olduğu kişiyle artık eşleşmeyecek şekilde değiştiğinde de bunu yapar. 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 toplanır.
Kişi Sağlayıcı, bir kişi satırını Contacts
tablosundaki kişi satırının _ID
sütunuyla ham kişi satırlarına bağlar. İşlenmemiş kişiler tablosunun CONTACT_ID
sütunu ContactsContract.RawContacts
her bir işlenmemiş kişiler satırıyla ilişkili kişiler satırı için _ID
değerleri içerir.
ContactsContract.Contacts
tablosunda kişi satırının "kalıcı" bağlantısı olan LOOKUP_KEY
sütunu da bulunur. Kişi Sağlayıcısı kişileri otomatik olarak koruduğundan toplama veya senkronizasyona yanıt olarak kişi satırının _ID
değerini değiştirebilir. Böyle bir durumda bile, CONTENT_LOOKUP_URI
içerik URI'sı (kişinin LOOKUP_KEY
) kombinasyonu yine kişi satırını işaret eder. Böylece, "favori" kişilerine yönelik bağlantıları korumak için LOOKUP_KEY
kullanabilirsiniz ve bu şekilde devam eder. Bu sütunun, _ID
sütununun biçimiyle ilgili olmayan kendine ait biçimi var.
Şekil 3'te üç ana tablonun birbiriyle ilişkisi gösterilmiştir.
![Kişi sağlayıcı ana tabloları](https://developer.android.google.cn/static/images/providers/contacts_tables.png?authuser=19&hl=tr)
3. Şekil. Kişiler, Ham Kişiler ve Ayrıntılar tablosu ilişkileri.
Dikkat: Uygulamanızı Google Play Store'da yayınlarsanız veya uygulamanız Android 10 (API düzeyi 29) ya da sonraki sürümleri çalıştıran bir cihazda yer alıyorsa sınırlı sayıda kişi verisi alanı ve yöntemi grubunun eski olduğunu unutmayın.
Belirtilen koşullar altında, sistem şu veri alanlarına yazılan tüm değerleri düzenli olarak siler:
-
ContactsContract.ContactOptionsColumns.LAST_TIME_CONTACTED
-
ContactsContract.ContactOptionsColumns.TIMES_CONTACTED
-
ContactsContract.DataUsageStatColumns.LAST_TIME_USED
-
ContactsContract.DataUsageStatColumns.TIMES_USED
Yukarıdaki veri alanlarını ayarlamak için kullanılan API'ler de eskidir:
Ayrıca, aşağıdaki alanlar artık sık görüşülen kişileri döndürmez. Bu alanlardan bazılarının, yalnızca kişiler belirli bir veri türünün parçası olduklarında kişilerin sıralamalarını etkilediğini unutmayın.
-
ContactsContract.Contacts.CONTENT_FREQUENT_URI
-
ContactsContract.Contacts.CONTENT_STREQUENT_URI
-
ContactsContract.Contacts.CONTENT_STREQUENT_FILTER_URI
-
CONTENT_FILTER_URI
(yalnızca E-posta, Telefon, Aranabilir ve İletişim kurulabilir veri türlerini etkiler) -
ENTERPRISE_CONTENT_FILTER_URI
(yalnızca E-posta, Telefon ve Aranabilir veri türlerini etkiler)
Uygulamalarınız bu alanlara veya API'lere erişiyor 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ı yerine getirebilirsiniz.
Uygulamanızın işlevlerinin bu değişiklikten etkilenmediğini doğrulamak için bu veri alanlarını manuel olarak temizleyebilirsiniz. Bu işlemi 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 adaptörlerinden alınan veriler
Kullanıcılar, kişi verilerini doğrudan cihaza girer. Ancak veriler, senkronizasyon bağdaştırıcıları aracılığıyla web hizmetlerinden Kişi Sağlayıcı'ya da aktarılır. Bu sayede cihaz ve hizmetler arasında veri aktarımı otomatik hale gelir. Senkronizasyon bağdaştırıcıları arka planda sistem kontrolü altında çalışır ve verileri yönetmek için ContentResolver
yöntemlerini çağırır.
Android'de, senkronizasyon bağdaştırıcısının çalıştığı web hizmeti bir hesap türüne göre tanımlanır. Her senkronizasyon bağdaştırıcısı bir hesap türüyle çalışır ancak söz konusu 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çıklanmıştır. Aşağıdaki tanımlarda daha ayrıntılı bilgi sunulmakta ve hesap türü ile adın senkronizasyon bağdaştırıcıları ve hizmetleriyle ilişkisi açıklanmaktadır.
- Hesap türü
-
Kullanıcının veri depoladığı bir hizmeti tanımlar. Çoğu zaman kullanıcının hizmetle kimlik doğrulaması yapması gerekir. Örneğin, Google Kişiler
google.com
koduyla tanımlanan bir hesap türüdür. 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şi tanımlar. Google Kişiler hesapları, hesap adı olarak e-posta adresi içeren Google hesaplarıyla aynıdır. Diğer hizmetler tek kelimelik kullanıcı adı veya sayısal kimlik kullanabilir.
Hesap türlerinin benzersiz olması gerekmez. Bir kullanıcı, birden fazla Google Kişiler hesabı yapılandırabilir ve verilerini Kişi Sağlayıcı'ya indirebilir. Kullanıcının kişisel bir hesap adı için bir özel kişi grubu, iş için de başka bir kişi grubu varsa bu durum meydana gelebilir. Hesap adları genellikle birbirinden farklıdır. Birlikte, Kişi Sağlayıcı ile harici bir hizmet arasında belirli bir veri akışını tanımlarlar.
Hizmetinizin verilerini Kişi Sağlayıcı'ya aktarmak istiyorsanız kendi senkronizasyon bağdaştırıcınızı yazmanız gerekir. Bu, 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 kişiler hakkındaki veri akışına nasıl uyum sağladığı gösterilmektedir. "Senkronizasyon bağdaştırıcıları" kutusunda her bağdaştırıcı, hesap türüne göre etiketlenir.
![Kişilerle ilgili veri akışı](https://developer.android.google.cn/static/images/providers/ContactsDataFlow.png?authuser=19&hl=tr)
4. Şekil. Kişi Sağlayıcısı veri akışı.
Gerekli izinler
Kişi Sağlayıcısı'na erişmek isteyen uygulamalar aşağıdaki izinleri istemelidir:
- Bir veya daha fazla tabloya okuma erişimi
-
READ_CONTACTS
,AndroidManifest.xml
öğesinde<uses-permission>
öğesi<uses-permission android:name="android.permission.READ_CONTACTS">
olarak belirtildi. - Bir veya daha fazla tabloya yazma erişimi
-
WRITE_CONTACTS
,AndroidManifest.xml
öğesinde<uses-permission>
öğesi<uses-permission android:name="android.permission.WRITE_CONTACTS">
olarak belirtildi.
Bu izinler, kullanıcı profili verilerini kapsamaz. Kullanıcı profili ve gerekli izinler, Kullanıcı profili bölümünde ele alınmaktadır.
Kullanıcının kişi verilerinin kişisel ve hassas olduğunu unutmayın. Kullanıcılar gizlilikleri konusunda endişe duyduklarından uygulamaların kendileri veya kişileri hakkında veri toplamasını istemezler. Kişi verilerine erişmek için neden izne ihtiyacınız olduğu belli değilse bu kişiler uygulamanıza düşük puan verebilir veya uygulamayı yüklemeyi reddedebilirler.
Kullanıcı profili
ContactsContract.Contacts
tablosunda, cihaz kullanıcısının profil verilerini içeren tek bir satır bulunur. Bu veriler, kullanıcının kişilerinden biri yerine cihazın user
bilgisini tanımlar. Profil kişileri satırı, bir profil kullanan her sistem için ham 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şim için sabit değerler, ContactsContract.Profile
sınıfında mevcuttur.
Kullanıcı profiline erişim özel izinler gerektirir. Kullanıcı profiline erişim, okuma ve yazma için gereken READ_CONTACTS
ve WRITE_CONTACTS
izinlerine ek olarak okuma ve yazma erişimi için de sırasıyla android.Manifest.permission#READ_PROFILE ve android.Manifest.permission#WRITE_PROFILE izinlerini gerektirir.
Kullanıcıların profillerini hassas olarak değerlendirmeniz gerektiğini unutmayın. android.Manifest.permission#READ_PROFILE izni, cihaz kullanıcısının kimliğini tanımlayan verilere erişmenizi sağlar. Uygulamanızın açıklamasında, kullanıcıya neden kullanıcı profili erişim izinlerine ihtiyaç duyduğunuzu açıkladığınızdan emin olun.
Kullanıcının profilini içeren kişi satırını geri almak için ContentResolver.query()
numaralı telefonu arayın. İçerik URI'sini CONTENT_URI
olarak ayarlayın ve herhangi bir seçim kriteri sağlamayın. Bu içerik URI'sını, profil için ham kişileri veya verileri almak üzere temel URI olarak da kullanabilirsiniz. Örneğin, bu snippet profile ait 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 çok kişi satırı alıyorsanız ve bunlardan birinin kullanıcı profili olup olmadığını belirlemek istiyorsanız 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ısı meta verileri
Kişi Sağlayıcısı, depodaki kişi verilerinin durumunu takip eden verileri yönetir. Depoyla ilgili bu meta veriler; Ham Kişiler, Veriler ve Kişiler tablosu satırları, ContactsContract.Settings
tablosu ve ContactsContract.SyncState
tablosu dahil olmak üzere çeşitli yerlerde depolanır. Aşağıdaki tabloda bu meta veri parçalarının her birinin etkisi gösterilmektedir:
Tablo 3. Kişi Sağlayıcı'daki meta veriler
Tablo | Sütun | Değerler | Anlamı |
---|---|---|---|
ContactsContract.RawContacts |
DIRTY |
"0": Son senkronizasyondan bu yana değişmemiştir. |
Cihazda değiştirilen ve tekrar sunucuyla senkronize edilmesi gereken ham kişileri işaretler. Android uygulamaları bir satırı güncellediğinde değer, Kişi Sağlayıcı tarafından otomatik olarak ayarlanır.
Ham kişiyi veya veri tablolarını değiştiren senkronizasyon bağdaştırıcıları |
"1" - Son senkronizasyondan sonra değişti, tekrar sunucu ile senkronize edilmesi gerekiyor. | |||
ContactsContract.RawContacts |
VERSION |
Bu satırın sürüm numarası. | Kişi Sağlayıcı, satır veya ilgili veriler 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ı her değiştirildiğinde bu değeri otomatik olarak artırır. |
ContactsContract.RawContacts |
SOURCE_ID |
Bu ham kişiyi, oluşturulduğu hesapla benzersiz şekilde tanımlayan bir dize değeri. |
Senkronizasyon bağdaştırıcısı yeni bir ham kişi oluşturduğunda bu sütun, sunucunun ham kişi için benzersiz kimliğine ayarlanmalıdır. Bir Android uygulaması yeni bir ham kişi oluşturduğunda, uygulamanın bu sütunu boş bırakması gerekir. Bu, senkronizasyon bağdaştırıcısına sunucuda yeni bir ham kişi oluşturması ve SOURCE_ID için bir değer alması gerektiğini bildirir.
Özellikle kaynak kimliğinin her hesap türü için benzersiz olması ve senkronizasyonlar arasında kararlı olması gerekir:
|
ContactsContract.Groups |
GROUP_VISIBLE |
"0" - Bu gruptaki kişiler Android uygulaması kullanıcı arayüzlerinde görünür olmamalıdır. | 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üzlerinde görünmez. |
Varsayılan olarak, ham kişilerinden hiçbiri bir gruba aitse kişiler görünmez (ham kişilerin grup üyeliği, ContactsContract.Data tablosunda bir veya daha fazla ContactsContract.CommonDataKinds.GroupMembership satırıyla gösterilir).
Bir hesap türü ve hesap için ContactsContract.Settings tablo satırında bu işareti ayarlayarak grubu olmayan kişilerin görünür olmasını sağlayabilirsiniz.
Bu işaretin bir kullanımı, grup kullanmayan sunuculardaki kişilerin gösterilmesidir.
|
"1" - Uygulama kullanıcı arayüzleri, bu hesap ve hesap türünde bir gruba ait olmayan kişiler tarafından görülebilir. | |||
ContactsContract.SyncState |
(tümü) | Senkronizasyon adaptörünüzün meta verilerini depolamak için bu tabloyu kullanın. | Bu tablo sayesinde, senkronizasyon durumunu ve senkronizasyonla ilgili diğer verileri cihazda kalıcı olarak depolayabilirsiniz. |
Kişi Sağlayıcı erişimi
Bu bölümde, Kişi Sağlayıcı'dan gelen verilere erişim yönergeleri ve aşağıdakilere odaklanılmıştır:
- Varlık sorguları.
- Toplu değişiklik.
- Amaçlarla alma ve değiştirme.
- Veri bütünlüğü.
Senkronizasyon bağdaştırıcısından değişiklik yapma konusu da Kişi Sağlayıcı senkronizasyon bağdaştırıcıları bölümünde daha ayrıntılı olarak ele alınmıştır.
Varlıkları sorgulama
Kişi Sağlayıcısı tabloları bir hiyerarşi içinde düzenlendiği için bir satırı ve ona bağlı tüm "alt" satırları almak genellikle yararlıdır. Örneğin, bir kişiyle ilgili tüm bilgileri görüntülemek için tek bir ContactsContract.Contacts
satırı için tüm ContactsContract.RawContacts
satırlarını veya tek bir ContactsContract.RawContacts
satırı için tüm ContactsContract.CommonDataKinds.Email
satırlarını almak isteyebilirsiniz. Kişi Sağlayıcısı, bunu kolaylaştırmak için tablolar arasında veritabanı birleştirmesi gibi davranan entity yapıları sunar.
Varlık, bir üst tablodan ve onun alt tablosundan seçili sütunlardan oluşan bir tablo gibidir.
Bir varlığı sorguladığınızda, varlıkta bulunan sütunlara göre bir projeksiyon ve arama ölçütü sağlarsınız. Sonuç olarak, alınan her alt tablo satırı için bir satır içeren bir Cursor
elde edilir. Örneğin, ContactsContract.Contacts.Entity
adlı kullanıcıyı bir kişi adı için ve bu ada ait tüm ham kişilerin ContactsContract.CommonDataKinds.Email
satırlarını sorgularsanız her ContactsContract.CommonDataKinds.Email
satırı için bir satır içeren bir Cursor
alırsınız.
Varlıklar sorguları basitleştirir. Bir varlık kullanarak, bir kimlik almak için önce üst tabloyu sorgulamak ve ardından bu kimlikle alt tabloyu sorgulamak zorunda kalmadan, bir kişi veya ham kişinin tüm kişi verilerini tek seferde alabilirsiniz. Ayrıca Kişi Sağlayıcısı, sorguyu tek bir işlemdeki bir varlığa göre işler, bu da alınan verilerin dahili olarak tutarlı olmasını sağlar.
Not: Bir varlık genellikle üst ve alt tablonun tüm sütunlarını içermez. Varlık için sütun adı sabit değerleri listesinde yer almayan bir sütun adıyla çalışmaya çalışırsanız Exception
alırsınız.
Aşağıdaki snippet bir kişinin tüm işlenmemiş kişi satırlarının nasıl alınacağını gösterir. Snippet, "ana" ve "ayrıntı" olmak üzere iki etkinliği olan daha büyük bir uygulamanın parçasıdır. Ana etkinlikte, kişi satırlarının listesi gösterilir. Kullanıcı bir kişi seçtiğinde etkinlik, kimliğini ayrıntı etkinliğine gönderir. Ayrıntı etkinliği, seçilen kişiyle ilişkili tüm ham kişilerden gelen tüm veri satırlarını görüntülemek için ContactsContract.Contacts.Entity
kullanır.
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()
öğesine bir geri çağırmayı çağırır. Bu yönteme gelen bağımsız değişkenlerden biri, sorgunun sonuçlarını içeren bir Cursor
'dir. Kendi uygulamanızda, görüntülemek veya daha fazla çalışmak için bu Cursor
öğesindeki verileri alabilirsiniz.
Toplu değişiklik
Mümkün olduğunda, ContentProviderOperation
nesneden ArrayList
tane oluşturup applyBatch()
yöntemini çağırarak Kişi Sağlayıcı'daki verileri "toplu modda"
eklemeniz, güncellemeniz ve silmeniz gerekir. Kişi Sağlayıcısı, tüm işlemleri applyBatch()
türünde tek bir işlemde gerçekleştirdiğinden, değişiklikleriniz kişiler deposunda hiçbir zaman tutarsız bir durumda kalmayacaktır. Toplu değişiklik, ham kişi ve ayrıntı verilerinin aynı anda eklenmesini de kolaylaştırır.
Not: Tek bir ham kişiyi değiştirmek isterseniz söz konusu değişikliği uygulamanızda gerçekleştirmek yerine cihazın kişiler uygulamasına niyet gönderebilirsiniz. Bu işlemin yapılması, Amaçlarla veri alma ve değiştirme bölümünde daha ayrıntılı olarak açıklanmıştır.
Getiri puanları
Çok sayıda işlem içeren bir toplu değişiklik, diğer işlemleri engelleyerek genel kullanıcı deneyimini olumsuz etkileyebilir. Yapmak istediğiniz tüm değişiklikleri mümkün olduğunca az sayıda ayrı liste halinde düzenlemek ve aynı zamanda bunların sistemi engellemelerini önlemek amacıyla bir veya daha fazla işlem için getiri noktaları belirlemeniz gerekir.
Getiri noktası, isYieldAllowed()
değeri true
olarak ayarlanmış bir ContentProviderOperation
nesnesidir. Kişi Sağlayıcısı bir getiri noktasıyla karşılaştığında diğer işlemlerin çalıştırılmasına izin vermek için çalışmasını duraklatır ve geçerli işlemi kapatır. Sağlayıcı tekrar başladığında, ArrayList
içinde bir sonraki işlemle devam eder ve yeni bir işlem başlatır.
Getiri noktaları, applyBatch()
öğesine yapılan çağrı başına birden fazla işlemle sonuçlanır. Bu nedenle, ilgili satır kümesi için son işlem için bir getiri noktası ayarlamanız 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 ilişkili satır kümesi için son işlem için bir getiri noktası ayarlamanız gerekir.
Akım noktaları aynı zamanda bir atomik işlem birimidir. İki getiri noktası arasındaki tüm erişimler, tek bir birim olarak başarılı veya başarısız olur. Herhangi bir getiri noktası ayarlamazsanız en küçük atom işlemi, tüm işlem grubu olur. Getiri puanları kullandığınızda işlemlerin sistem performansının düşmesini önlerken aynı zamanda bir işlem alt kümesinin atomik olmasını da sağlamış olursunuz.
Eski değişiklik referansları
Yeni bir ham kişi satırını ve bununla ilişkili veri satırlarını ContentProviderOperation
nesne kümesi olarak eklerken ham kişinin _ID
değerini RAW_CONTACT_ID
değeri olarak ekleyerek veri satırlarını ham kişi satırına bağlamanız gerekir. Ancak ham kişi satırı için ContentProviderOperation
özelliğini henüz uygulamadığınızdan bu değer, veri satırı için ContentProviderOperation
oluşturulurken kullanılamaz. Bu sorunu çözmek için ContentProviderOperation.Builder
sınıfı withValueBackReference()
yöntemini kullanır.
Bu yöntem, önceki bir işlemin sonucunu içeren bir sütunu 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ıdır. Bu bağımsız değişkenin değeri, değiştirmekte olduğunuz tablodaki bir sütunun adı olmalıdır.
-
previousResult
-
applyBatch()
kaynağındanContentProviderResult
nesne dizisindeki bir değerin 0 tabanlı dizini. Toplu işlemler uygulandıkça, her işlemin sonucu ara sonuç dizisinde depolanır.previousResult
değeri,key
değeriyle alınıp saklanan bu sonuçlardan birinin dizinidir. Bu işlem, yeni bir ham kişi kaydı eklemenize ve_ID
değerini geri almanıza, ardından birContactsContract.Data
satırı eklediğinizde değere "geri başvuruda bulunmanıza" olanak tanır.applyBatch()
öğesini ilk kez çağırdığınızda sonuç dizisinin tamamı, sağladığınızContentProviderOperation
nesnedenArrayList
öğesinin boyutuna eşit bir boyutta oluşturulur. Bununla birlikte, sonuç dizisindeki tüm öğelernull
değerine ayarlanır ve henüz uygulanmamış bir işlem için sonuç için geri başvuru yapmaya çalışırsanızwithValueBackReference()
birException
döndürür.
Aşağıdaki snippet'lerde yeni bir ham kişinin ve verilerin toplu olarak nasıl ekleneceği gösterilmektedir. Bunlar, getiri noktası oluşturan ve geri referansı kullanan bir kod içerir.
İ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());
Bir sonraki 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 oluşturucu nesnesi, RAW_CONTACT_ID
elde etmek için withValueBackReference()
kullanır. Referans, ilk işlemden itibaren ContentProviderResult
nesnesine geri işaret eder. Bu nesne, ham kişi satırını ekler ve yeni _ID
değerini döndürür. Sonuç olarak her bir veri satırı, RAW_CONTACT_ID
değeri ile ait olduğu yeni ContactsContract.RawContacts
satırına otomatik olarak bağlanır.
E-posta satırını ekleyen ContentProviderOperation.Builder
nesnesi, bir getiri noktası ayarlayan 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, yeni ham kişi ve veri satırlarını ekleyen applyBatch()
çağrısını gösterir.
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, temel depoyu kilitlemek zorunda kalmadan değişiklik işlemleri uygulama yöntemi olan iyimser eşzamanlılık kontrolü uygulamanıza da olanak tanır. 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ı fark ederseniz işleminizi geri alıp yeniden deneyebilirsiniz.
İyimser eşzamanlılık kontrolü, aynı anda yalnızca bir kullanıcının bulunduğu ve bir veri deposuna eş zamanlı erişimin nadir olarak gerçekleştiği mobil cihazlar için kullanışlıdır. Kilitleme kullanılmadığı için kilit ayarlama veya diğer işlemlerin kilitlerini açmasını beklemeyle zaman kaybetmezsiniz.
Tek bir ContactsContract.RawContacts
satırını güncellerken iyimser eşzamanlılık kontrolünü kullanmak için aşağıdaki adımları uygulayın:
-
Aldığınız diğer verilerle birlikte ham kişinin
VERSION
sütununu da alın. -
newAssertQuery(Uri)
yöntemini kullanarak kısıtlamayı uygulamaya uygun birContentProviderOperation.Builder
nesnesi oluşturun. İçerik URI'si için ham kişinin_ID
eklendiği şekildeRawContacts.CONTENT_URI
kullanın. -
ContentProviderOperation.Builder
nesnesi içinwithValue()
yöntemini çağırarakVERSION
sütununu az önce aldığınız sürüm numarasıyla karşılaştırın. -
Aynı
ContentProviderOperation.Builder
içinwithExpectedCount()
çağrısı yaparak bu onaylama tarafından yalnızca bir satırın test edildiğinden emin olun. -
ContentProviderOperation
nesnesini oluşturmak içinbuild()
yöntemini çağırın, ardından bu nesneyiapplyBatch()
öğesine ilettiğinizArrayList
içindeki ilk nesne olarak ekleyin. - Toplu işlemi uygulayın.
Ham kişi satırı, satırı okumanız ile değiştirmeyi denediğiniz zaman arasında başka bir işlemle güncellenirse "hak talebi" ContentProviderOperation
başarısız olur ve tüm işlem grubu yedeklenir. Daha sonra grubu yeniden denemeyi veya başka bir işlem yapmayı seçebilirsiniz.
Aşağıdaki snippet, CursorLoader
kullanarak tek bir ham kişiyi sorguladıktan sonra nasıl "hak talebinde" ContentProviderOperation
oluşturulacağını gösterir:
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 }
Amaçlarla alma ve değiştirme
Cihazın kişiler uygulamasına amaç göndermek, Kişi Sağlayıcı'ya dolaylı olarak erişmenize olanak tanır. Amaç, cihazın kişiler uygulaması kullanıcı arayüzünü başlatır. Burada kullanıcılar, kişilerle ilgili işler yapabilir. Bu erişim türüyle kullanıcılar:
- Listeden bir kişi seçin ve bu kişinin daha fazla çalışabilmek için uygulamanıza geri döndürülmesini sağlayın.
- Mevcut bir kişinin verilerini düzenleme.
- Hesaplarından herhangi biri için yeni bir ham kişi ekleme.
- Bir kişiyi veya kişi verilerini silin.
Kullanıcı veri ekliyor veya güncelliyorsa önce verileri toplayıp amacın bir parçası olarak gönderebilirsiniz.
Cihazın Kişiler uygulaması üzerinden Kişi Sağlayıcı'ya erişmek için niyet kullandığınızda kendi kullanıcı arayüzünüzü veya sağlayıcıya erişim kodunuzu yazmanız gerekmez. Ayrıca sağlayıcıya okuma veya yazma izni istemeniz gerekmez. Cihazın kişiler uygulaması, bir kişi için size okuma izni yetkisi verebilir. Sağlayıcıda başka bir uygulama üzerinden değişiklikler yaptığınız için yazma izinlerine sahip olmanız gerekmez.
Bir sağlayıcıya erişmek için niyet 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ılavuzunda ayrıntılı olarak açıklanmıştır. 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 ek değerler ise ContactsContract.Intents.Insert
referans dokümanlarında listelenmiştir:
Tablo 4. Kişi Sağlayıcı Intent'leri.
Görev | İşlem | Veri | MIME türü | Notlar |
---|---|---|---|---|
Listeden kişi seçme | ACTION_PICK |
Şunlardan biri:
|
Kullanılmadı |
Sağladığınız içerik URI'sı türüne bağlı olarak, ham kişilerin listesini veya ham kişinin verilerinin listesini görüntüler.
Seçilen satırın içerik URI'sını döndüren |
Yeni bir ham kişi ekleme | Insert.ACTION |
Yok |
RawContacts.CONTENT_TYPE , bir grup ham kişi için MIME türü.
|
Cihazın kişiler uygulamasının Kişi Ekle ekranını görüntüler. Amaca eklediğiniz ekstra değerler gösterilir. startActivityForResult() ile gönderilirse yeni eklenen ham kişinin içerik URI'sı, "data" (veriler) alanındaki Intent bağımsız değişkenindeki etkinliğinizin onActivityResult() geri çağırma yöntemine geri gönderilir. Değeri öğrenmek için getData() numaralı telefonu arayın.
|
Kişiyi düzenleme | ACTION_EDIT |
Kişi için CONTENT_LOOKUP_URI . Düzenleyici etkinliği, kullanıcının bu kişiyle ilişkili tüm verileri düzenlemesine
izin verir.
|
Contacts.CONTENT_ITEM_TYPE , tek bir kişi. |
Kişiler uygulamasında Kişiyi Düzenle ekranını görüntüler. Niyete eklediğiniz ekstra değerler gösterilir. Kullanıcı, düzenlemeleri kaydetmek için Bitti'yi tıkladığında etkinliğiniz ön plana döner. |
Veri ekleyebilen bir seçici görüntüleyin. | ACTION_INSERT_OR_EDIT |
Yok |
CONTENT_ITEM_TYPE
|
Bu amaç, her zaman kişiler uygulamasının seçici ekranını gösterir. Kullanıcı, düzenlemek üzere bir kişi seçebilir veya yeni bir kişi ekleyebilir. Kullanıcının seçimine bağlı olarak düzenleme veya ekleme ekranı görünür ve amaçta ilettiğiniz ekstra veriler görüntülenir. Uygulamanız e-posta veya telefon numarası gibi kişi verileri gösteriyorsa kullanıcının bu verileri mevcut bir kişiye eklemesine izin vermek için bu niyeti kullanın.
kişi,
Not: Kullanıcı her zaman mevcut bir adı seçtiğinden veya yeni bir ad eklediğinden, bu niyetin ekstra özelliklerinde bir ad değeri göndermenize gerek yoktur. Buna ek olarak, 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 etmez ve düzenlemeyi kaydederse eski değer kaybolur. |
Cihazın kişiler uygulaması, ham bir kişiyi veya niyeti belli bir kişinin verilerini silmenize izin vermez. Bunun yerine, ham bir kişiyi silmek için ContentResolver.delete()
veya ContentProviderOperation.newDelete()
işlevini kullanın.
Aşağıdaki snippet, yeni bir ham kişi ve veri ekleyen bir niyetin nasıl oluşturulacağını ve gönderileceğini göstermektedir:
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şiler deposu, kullanıcıların doğru ve güncel olmasını beklediği önemli ve hassas veriler içerdiğinden, Kişi 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 birContactsContract.CommonDataKinds.StructuredName
satırı ekleyin. ContactsContract.Data
tablosundaContactsContract.CommonDataKinds.StructuredName
satırı olmayan birContactsContract.RawContacts
satırı, toplama sırasında sorunlara neden olabilir.-
Yeni
ContactsContract.Data
satırlarını her zaman üstContactsContract.RawContacts
satırına bağlayın. -
ContactsContract.RawContacts
öğesine bağlı olmayanContactsContract.Data
satırı, cihazın kişiler uygulamasında görünmez ve senkronizasyon adaptörleriyle ilgili sorunlara neden olabilir. - Yalnızca sahip olduğunuz ham kişilerin verilerini değiştirin.
- Kişi Sağlayıcısının genellikle birkaç farklı hesap türünden/online hizmetten verileri yönettiğini unutmayın. Uygulamanızın yalnızca size ait satırlardaki verileri değiştirdiğinden veya sildiğinden ve yalnızca sizin kontrol ettiğiniz bir hesap türü ve ada sahip verileri 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 zamanContactsContract
ve alt sınıflarında tanımlanan sabitleri kullanın. - Bu sabit değerleri kullanmak, hataları önlemenize yardımcı olur. Ayrıca, sabit değerlerden herhangi biri kullanımdan kaldırılırsa derleyici uyarılarıyla bilgilendirilirsiniz.
Özel veri satırları
Kendi özel MIME türlerinizi oluşturup kullanarak ContactsContract.Data
tablosunda kendi veri satırlarınızı ekleyebilir, düzenleyebilir, silebilir ve alabilirsiniz. Satırlarınız, ContactsContract.DataColumns
içinde tanımlanan sütunun kullanımıyla sınırlıdır ancak kendi türe özel sütun adlarınızı varsayılan sütun adlarıyla eşleyebilirsiniz. Cihazın kişiler uygulamasında, satırlarınıza ait veriler görüntülenir ancak düzenlenemez veya silinemez. Ayrıca kullanıcılar daha fazla veri ekleyemez. Kullanıcıların özel veri satırlarınızı değiştirmesine izin vermek için kendi uygulamanızda bir düzenleyici etkinliği sağlamanız gerekir.
Özel verilerinizi görüntülemek için <ContactsAccountType>
öğesi ve bu öğenin <ContactsDataKind>
alt öğelerinden bir veya daha fazlasını içeren bir contacts.xml
dosyası sağlayın. Bu, <ContactsDataKind> element
bölümünde daha ayrıntılı bir şekilde açıklanmaktadır.
Özel MIME türleri hakkında daha fazla bilgi edinmek için İçerik Sağlayıcı Oluşturma kılavuzunu okuyun.
Kişi Sağlayıcı senkronizasyon bağdaştırıcıları
Kişi Sağlayıcı, özel olarak bir cihaz ve online hizmet arasında kişi verilerinin senkronizasyonunu gerçekleştirmek için tasarlanmıştır. Bu, kullanıcıların mevcut verileri yeni bir cihaza indirmelerine ve mevcut verileri yeni bir hesaba yüklemelerine olanak tanır. Senkronizasyon ayrıca kullanıcıların, ekleme ve değişikliklerin kaynağından bağımsız olarak en güncel verilere sahip olmalarını da sağlar. Senkronizasyonun bir başka avantajı da cihaz ağa bağlı olmadığında bile kişi verilerinin kullanılabilmesidir.
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 dayalı olarak senkronizasyonun planlanması ve yürütülmesi.
- Duran senkronizasyonları yeniden başlatma.
Bu çerçeveyi kullanmak için bir senkronizasyon adaptörü eklentisi sağlamanız gerekir. Her senkronizasyon bağdaştırıcısı bir hizmet ve içerik sağlayıcıya özgüdür ancak aynı hizmet için birden fazla hesap adını işleyebilir. Bu çerçeve, aynı hizmet ve sağlayıcı için birden fazla senkronizasyon bağdaştırıcısına da izin verir.
Bağdaştırıcı sınıflarını ve dosyalarını senkronize etme
Bir senkronizasyon bağdaştırıcısını AbstractThreadedSyncAdapter
alt sınıfı olarak uygular ve bir Android uygulamasının parçası olarak yüklersiniz. Sistem, senkronizasyon adaptörünü uygulama manifestinizdeki öğelerden ve manifest dosyası tarafından işaret edilen özel bir XML dosyasından öğrenir. XML dosyası, online hizmetin hesap türünü ve içerik sağlayıcının yetkilisini tanımlar. Bunlar birlikte bağdaştırıcıyı benzersiz bir şekilde tanımlar. Kullanıcı, senkronizasyon bağdaştırıcısının hesap türü için bir hesap ekleyip senkronizasyon bağdaştırıcısının senkronize edildiği içerik sağlayıcı için senkronizasyonu etkinleştirene kadar senkronizasyon adaptörü etkin hale gelmez. Bu noktada, sistem bağdaştırıcıyı yönetmeye başlar ve içerik sağlayıcı ile sunucu arasında senkronizasyon yapmak için gerektiği şekilde çağırır.
Not: Senkronizasyon bağdaştırıcısının kimliğinin parçası olarak bir hesap türünün kullanılması, sistemin aynı kuruluştan farklı hizmetlere erişen senkronizasyon bağdaştırıcılarını algılayıp gruplandırmasına olanak tanır. Örneğin, Google online hizmetlerinin senkronizasyon bağdaştırıcıları aynı hesap türüne (com.google
) sahiptir. Kullanıcılar cihazlarına bir Google hesabı eklediklerinde, Google hizmetleri için yüklü 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ısıyla senkronize edilir.
Çoğu hizmet, kullanıcıların verilere erişmeden önce kimliklerini doğrulamasını gerektirdiğinden Android sistemi, senkronizasyon adaptörü çerçevesine benzer ve genellikle onunla birlikte kullanılan bir kimlik doğrulama çerçevesi sunar. Kimlik doğrulama çerçevesi, AbstractAccountAuthenticator
alt sınıfları olan eklenti kimlik doğrulayıcıları kullanır. Kimlik doğrulayıcı, kullanıcının kimliğini aşağıdaki adımlarda doğrular:
- Kullanıcının adı, şifresi veya benzer bilgileri (kullanıcının kimlik bilgileri) toplar.
- Kimlik bilgilerini hizmete gönderir
- Hizmetin yanıtını inceler.
Hizmet, kimlik bilgilerini kabul ederse kimlik doğrulayıcı, kimlik bilgilerini daha sonra kullanmak üzere saklayabilir. Eklenti kimlik doğrulayıcı çerçevesi sayesinde AccountManager
, bir kimlik doğrulayıcının desteklediği ve etkinleştirmeyi seçtiği tüm kimlik doğrulama jetonlarına (ör. OAuth2 kimlik doğrulama jetonları) erişim sağlayabilir.
Kimlik doğrulama zorunlu olmasa da çoğu kişi hizmeti tarafından kullanılır. Ancak kimlik doğrulaması için Android kimlik doğrulama çerçevesini kullanmanız gerekmez.
Senkronizasyon bağdaştırıcısı uygulaması
Kişi Sağlayıcı için bir senkronizasyon bağdaştırıcısı uygulamak üzere öncelikle aşağıdakileri içeren bir Android uygulaması oluşturmanız gerekir:
-
Senkronizasyon bağdaştırıcısına bağlanmak için sistemden gelen isteklere yanıt veren bir
Service
bileşeni. -
Sistem bir senkronizasyon çalıştırmak istediğinde senkronizasyon adaptörü için bir
IBinder
almak amacıyla hizmetinonBind()
yöntemini çağırır. Bu, sistemin bağdaştırıcının yöntemlerine çapraz işlem yapmasına olanak tanır. -
AbstractThreadedSyncAdapter
öğesinin somut bir alt sınıfı olarak uygulanmış gerçek senkronizasyon bağdaştırıcısı. -
Bu sınıf; sunucudan veri indirme, cihazdan veri yükleme ve çakışmaları çözme işlerini yapar. Adaptörün ana işi,
onPerformSync()
yönteminde yapılır. Bu sınıf, bir singleton olarak gösterilmelidir. -
Application
alt sınıfı. -
Bu sınıf, senkronizasyon adaptörü tekli için fabrika işlevi görür. Senkronizasyon bağdaştırıcısını örneklendirmek için
onCreate()
yöntemini kullanın ve tekilleştirmeyi senkronizasyon adaptörü hizmetininonBind()
yöntemine döndürmek için statik bir "getter" yöntemi sağlayın. -
İsteğe bağlı: Kullanıcı kimlik doğrulaması için sistemden gelen isteklere yanıt veren bir
Service
bileşeni. -
AccountManager
, kimlik doğrulama işlemini başlatmak için bu hizmeti başlatır. HizmetinonCreate()
yöntemi, bir kimlik doğrulayıcı nesnesi oluşturur. 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 birIBinder
almak amacıyla hizmetinonBind()
yöntemini çağırır. Bu, sistemin kimlik doğrulayıcının yöntemlerine çapraz işlem çağrıları yapmasına olanak tanır. -
İsteğe bağlı: Kimlik doğrulama isteklerini işleyen somut bir
AbstractAccountAuthenticator
alt sınıfı. -
Bu sınıf, kullanıcının kimlik bilgilerini sunucuda doğrulamak için
AccountManager
tarafından çağrılan yöntemler sunar. Kimlik doğrulama sürecinin ayrıntıları, kullanılan sunucu teknolojisine bağlı olarak büyük ölçüde değişiklik gösterir. Kimlik doğrulama hakkında daha fazla bilgi edinmek için sunucu yazılımınızın dokümanlarına bakmanız gerekir. - Sistem için senkronizasyon bağdaştırıcısını ve kimlik doğrulayıcıyı tanımlayan XML dosyaları.
-
Daha önce açıklanan senkronizasyon bağdaştırıcısı ve kimlik doğrulayıcı hizmet bileşenleri, uygulama manifestindeki
<service>
öğelerinde tanımlanmıştır. Bu öğeler, sisteme belirli veriler sağlayan<meta-data>
alt öğeler içerir:-
Senkronizasyon bağdaştırıcısı hizmetinin
<meta-data>
öğesi,res/xml/syncadapter.xml
XML dosyasını işaret eder. Buna karşılık, bu dosya web hizmeti için Kişi Sağlayıcı ile senkronize edilecek bir URI ve web hizmeti için bir hesap türü belirtir. -
İsteğe bağlı: Kimlik doğrulayıcının
<meta-data>
öğesi,res/xml/authenticator.xml
XML dosyasına işaret eder. Bu dosya, kimlik doğrulayıcının desteklediği hesap türünün yanı sıra kimlik doğrulama işlemi sırasında görünen kullanıcı arayüzü kaynaklarını da belirtir. Bu öğede belirtilen hesap türü, senkronizasyon bağdaştırıcısı için belirtilen hesap türüyle aynı olmalıdır.
-
Senkronizasyon bağdaştırıcısı hizmetinin
Sosyal akış verileri
android.provider.ContactsContract.StreamItems ve android.provider.ContactsContract.StreamItemPhotos tabloları, sosyal ağlardan gelen verileri yönetir. Bu tablolara kendi ağınızdan akış verisi ekleyen bir senkronizasyon bağdaştırıcısı yazabilir ya da bu tablolardaki akış verilerini okuyup kendi uygulamanızda görüntüleyebilir veya ikisini birden yapabilirsiniz. Bu özellikler sayesinde, sosyal ağ hizmetleriniz ve uygulamalarınız Android'in sosyal ağ deneyimine entegre edilebilir.
Sosyal akış metni
Akış öğeleri her zaman ham bir kişiyle ilişkilendirilir. android.provider.ContactsContract.StreamItemsColumn#RAW_CONTACT_ID, ham kişinin _ID
değerine bağlantı verir. Ham kişinin hesap türü ve hesap adı da akış öğesi satırında depolanır.
Akışınıza ait 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ü. Bir akış öğesi eklerken bu değeri ayarlamayı unutmayın.
- android.provider.ContactsContract.StreamItemsColumn#ACCOUNT_NAME
- Zorunlu. Bu akış öğesiyle ilişkili ham kişi için kullanıcının hesap adı. Bir akış öğesi eklerken bu değeri ayarlamayı unutmayın.
- Tanımlayıcı sütunları
-
Zorunlu. Bir akış öğesi eklerken aşağıdaki tanımlayıcı sütunlarını eklemeniz gerekir:
- android.provider.ContactsContract.StreamItemscolumn#CONTACT_ID: Bu akış öğesinin ilişkilendirildiği kişinin android.provider.BaseColumn#_ID değeri.
- android.provider.ContactsContract.StreamItemsColumn#CONTACT_LOOKUP_KEY: Bu akış öğesinin ilişkili olduğu kişinin android.provider.ContactsContract.ContactsColumn#LOOKUP_KEY değeri.
- android.provider.ContactsContract.StreamItemsColumn#RAW_CONTACT_ID: Bu akış öğesinin ilişkilendirildiği ham kişinin android.provider.BaseColumn#_ID değeri.
- android.provider.ContactsContract.StreamItemsColumn#COMMENTS
- İsteğe bağlıdır. Bir akış öğesinin başında gösterebileceğiniz özet bilgileri depolar.
- android.provider.ContactsContract.StreamItemsColumn#TEXT
-
Akış öğesinin metni (öğenin kaynağı tarafından yayınlanan içerik veya akış öğesini oluşturan bir işlemin açıklaması). Bu sütun,
fromHtml()
tarafından oluşturulabilecek tüm biçimlendirmeleri ve yerleştirilmiş kaynak resimlerini içerebilir. Sağlayıcı, uzun içeriği kesebilir veya elips haline getirebilir ancak etiketleri kırmaktan kaçınmaya çalışır. - android.provider.ContactsContract.StreamItemsColumn#TIMESTAMP
- Akış öğesinin epoch'tan beri eklendiği veya güncellendiği zamanı içeren milisaniye biçimindeki metin dizesi. Akış öğelerini ekleyen veya güncelleyen uygulamalar bu sütunun sorumluluğundadır; sütun, Kişi Sağlayıcı tarafından otomatik olarak saklanmaz.
Akış öğelerinizin tanımlayıcı bilgilerini görüntülemek için android.provider.ContactsContract.StreamItemsColumn#RES_ICON, android.provider.ContactsContract.StreamItemsColumn#RES_LABEL ve android.provider.ContactsContract.StreamItemsColumn#RES_PACKAGE öğelerini kullanarak uygulamanızdaki kaynaklara bağlantı verin.
android.provider.ContactsContract.StreamItems tablosu, senkronizasyon bağdaştırıcılarının özel kullanımına ilişkin android.provider.ContactsContract.StreamItemsColumn#SYNC1 ile android.provider.ContactsContract.StreamItemsColumn#SYNC4 sütunlarını da içerir.
Sosyal akış fotoğrafları
android.provider.ContactsContract.StreamItemPhotos tablosu, bir akış öğesiyle ilişkili fotoğrafları depolar. Tablonun
android.provider.ContactsContract.StreamItemPhotosSütunlar#STREAM_ITEM_ID sütunu,
android.provider.ContactsContract.StreamItems tablosunun _ID
sütunundaki değerlere bağlantı oluşturur. Fotoğraf referansları, tabloda şu sütunlarda 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ılan ikili gösterimi. Bu sütun, fotoğrafları depolamak için kendisini kullanan Kişi Sağlayıcı'nın önceki sürümleriyle geriye dönük uyumluluk için kullanılabilir. Ancak, geçerli sürümde fotoğrafları saklamak için bu sütunu kullanmamanız gerekir. Bunun yerine, fotoğrafları bir dosyada depolamak için android.provider.ContactsContract.StreamItemPhotosSütunlar#PHOTO_FILE_ID veya android.provider.ContactsContract.StreamItemPhotosColumn#PHOTO_URI (her ikisi de aşağıda açıklanmıştır) kullanın. Bu sütunda artık fotoğrafın okunabilecek bir küçük resmi bulunuyor.
- android.provider.ContactsContract.StreamItemPhotosSütunlar#PHOTO_FILE_ID
-
Ham kişi için fotoğrafın sayısal tanımlayıcısı. Tek bir fotoğraf dosyasını gösteren içerik URI'sı almak için bu değeri
DisplayPhoto.CONTENT_URI
sabit değerine ekleyin ve ardından, fotoğraf dosyasını tanıtacak kullanıcı adı almak içinopenAssetFileDescriptor()
yöntemini çağırın. - android.provider.ContactsContract.StreamItemPhotosSütunlar#PHOTO_URI
-
Bu satırla gösterilen fotoğrafın fotoğraf dosyasını doğrudan işaret eden bir içerik URI'sı.
Fotoğraf dosyasına bir herkese açık kullanıcı adı almak için
openAssetFileDescriptor()
yöntemini bu URI ile çağırın.
Sosyal akış tablolarını kullanma
Bu tablolar, Kişi Sağlayıcı'daki diğer ana tablolarla aynı şekilde çalışır. Tek fark:
- Bu tablolar için ek erişim izinleri gerekir. Bunları okuyabilmek için uygulamanızın android.Manifest.permission#READ_SOCIAL_STREAM iznine sahip olması gerekir. Bunları değiştirebilmeniz için uygulamanızın android.Manifest.permission#WRITE_SOCIAL_STREAM iznine sahip olması gerekir.
-
android.provider.ContactsContract.StreamItems tablosunda, her bir ham kişi için depolanan satır sayısı sınırlıdır. Bu sınıra ulaşıldığında, Kişi Sağlayıcı en eski android.provider.ContactsContract.StreamItemsColumn#TIMESTAMP öğesine sahip satırları otomatik olarak silerek yeni akış öğesi satırları için yer açar. Sınırı almak için android.provider.ContactsContract.StreamItems#CONTENT_LIMIT_URI içerik URI'sine bir sorgu gönderin. İçerik URI'sı dışındaki tüm bağımsız değişkenleri
null
olarak ayarlanmış şekilde bırakabilirsiniz. Sorgu, tek sütunlu android.provider.ContactsContract.StreamItems#MAX_ITEMS adet tek satır içeren bir İmleç 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 adlı alt tabloyu tanımlar.
Sosyal akış etkileşimleri
Kişi Sağlayıcı tarafından yönetilen sosyal akış verileri, cihazın kişiler uygulamasıyla birlikte, sosyal ağ sisteminizi mevcut kişilerinize bağlamak için etkili bir yol sunar. Aşağıdaki özellikler kullanılabilir:
- Sosyal ağ hizmetinizi bir senkronizasyon bağdaştırıcısı ile Kişi Sağlayıcı ile senkronize ederek bir kullanıcının kişilerine ilişkin en son etkinlikleri alabilir ve bunları daha sonra kullanmak üzere android.provider.ContactsContract.StreamItems ve android.provider.ContactsContract.StreamItemPhotos tablolarında depolayabilirsiniz.
- Normal senkronizasyonun yanı sıra, kullanıcı görüntülemek üzere bir kişi seçtiğinde ek veri almak için senkronizasyon bağdaştırıcınızı tetikleyebilirsiniz. Bu, senkronizasyon adaptörünüzün kişiyle ilgili yüksek çözünürlüklü fotoğrafları ve en son akış öğelerini almasını sağlar.
- Cihazın kişiler uygulamasına ve Kişi Sağlayıcı'ya bir bildirim kaydederek bir kişi görüntülendiğinde amaç alabilir ve bu noktada, kişinin durumunu hizmetinizden güncelleyebilirsiniz. Bu yaklaşım daha hızlı olabilir ve senkronizasyon adaptörüyle tam senkronizasyon yapmaktan daha az bant genişliği kullanabilir.
- Kullanıcılar, bir kişiyi cihazın kişiler uygulamasında görürken sosyal ağ hizmetinize ekleyebilir. Bu özelliği, ağınıza mevcut bir kişiyi ekleyen bir etkinliğin yanı sıra cihazın kişiler uygulamasına ve Kişiler Sağlayıcı'ya uygulamanızın ayrıntılarını sağlayan bir XML dosyası kombinasyonu ile etkinleştirdiğiniz"kişi davet et" özelliğini kullanabilirsiniz.
Akış öğelerinin Kişi Sağlayıcı ile normal senkronizasyonu, diğer senkronizasyonlarla aynıdır. 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 göz atın. Bildirimleri kaydetme ve kişi davet etme konusu sonraki iki bölümde ele alınmıştır.
Sosyal ağ görüntülemelerini yönetmek için kaydolma
Kullanıcı, senkronizasyon bağdaştırıcınız tarafından yönetilen bir kişiyi görüntülediğinde bildirim almak üzere senkronizasyon bağdaştırıcınızı kaydetmek için:
-
Projenizin
res/xml/
dizinindecontacts.xml
adlı bir dosya oluşturun. Bu dosyaya zaten sahipseniz bu adımı atlayabilirsiniz. -
Bu dosyaya
<ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android">
öğesini ekleyin. Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz. -
Kullanıcı, cihazın kişiler uygulamasında bir kişinin ayrıntılar sayfasını açtığında bildirim alan bir hizmeti kaydetmek için öğeye
viewContactNotifyService="serviceclass"
özelliğini ekleyin. Buradaserviceclass
, cihazın kişiler uygulamasından amacı alması gereken hizmetin tam nitelikli sınıf adıdır. Bildirimci hizmeti için, hizmetin amaçları almasına izin vermek amacıylaIntentService
öğesini genişleten bir sınıf kullanın. Gelen amaçtaki veriler, kullanıcının tıkladığı ham kişinin içerik URI'sını içerir. Bildirimci hizmetinden, ham kişinin verilerini güncellemek için senkronizasyon bağdaştırıcınıza bağlanıp bunu çağırabilirsiniz.
Kullanıcı bir akış öğesini, fotoğrafını ya da ikisini birden tıkladığında çağrılacak bir etkinliği kaydetmek için:
-
Projenizin
res/xml/
dizinindecontacts.xml
adlı bir dosya oluşturun. Bu dosyaya zaten sahipseniz bu adımı atlayabilirsiniz. -
Bu dosyaya
<ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android">
öğesini ekleyin. Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz. -
Kullanıcının, cihazın kişiler uygulamasındaki bir akış öğesini tıklamasını işlemek amacıyla etkinliklerinizden birini kaydetmek için
viewStreamItemActivity="activityclass"
özelliğini öğeye ekleyin. Buradaactivityclass
, cihazın kişiler uygulamasından amacı alması gereken etkinliğin tam sınıf adıdır. -
Kullanıcının, cihazın kişiler uygulamasındaki bir akış fotoğrafını tıklamasını işleme almak amacıyla etkinliklerinizden birini kaydetmek için
viewStreamItemPhotoActivity="activityclass"
özelliğini öğeye ekleyin. Buradaactivityclass
, cihazın kişiler uygulamasından amacı alması gereken etkinliğin tam sınıf adıdır.
<ContactsAccountType>
öğesi, <ContactsAccountType> öğesi bölümünde daha ayrıntılı olarak açıklanmıştır.
Gelen intent, kullanıcının tıkladığı öğenin veya fotoğrafın içerik URI'sını içerir. Metin öğeleri ve fotoğraflar için ayrı etkinlikleriniz olması için her iki özelliği aynı dosyada kullanın.
Sosyal ağ hizmetinizle etkileşimde bulunma
Kullanıcıların, bir kişiyi sosyal ağ sitenize davet etmek için cihazın Kişiler uygulamasından çıkmaları gerekmez. Bunun yerine, cihazdaki kişiler uygulamasının kişiyi etkinliklerinizden birine davet etmek için bir niyet göndermesini sağlayabilirsiniz. Bunu ayarlamak için:
-
Projenizin
res/xml/
dizinindecontacts.xml
adlı bir dosya oluşturun. Bu dosyaya zaten sahipseniz bu adımı atlayabilirsiniz. -
Bu dosyaya
<ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android">
öğesini ekleyin. Bu öğe zaten mevcutsa bu adımı atlayabilirsiniz. -
Aşağıdaki özellikleri ekleyin:
inviteContactActivity="activityclass"
-
inviteContactActionLabel="@string/invite_action_label"
activityclass
değeri, amacı alması gereken etkinliğin tam nitelikli sınıfadıdır.invite_action_label
değeri, cihazın kişiler uygulamasındaki Bağlantı Ekle menüsünde görüntülenen 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şi Sağlayıcı ile etkileşimini kontrol eden XML öğelerini içerir. Bu öğeler aşağıdaki bölümlerde açıklanmıştır.
<ContactsAccountType> öğesi
<ContactsAccountType>
öğesi, uygulamanızın kişiler uygulamasıyla etkileşimini kontrol eder. Aşağıdaki söz dizimine sahiptir:
<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">
şunu içeriyor:
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ı güncellendiğinde kullanıcılara bildirmesine ve benzeri işlemleri gerçekleştirmesine olanak tanıyan Android bileşenlerini ve kullanıcı arayüzü etiketlerini tanımlar.
android:
özellik ön ekinin, <ContactsAccountType>
özellikleri için gerekli olmadığına dikkat edin.
Özellikler:
inviteContactActivity
- Kullanıcı, cihazın kişiler uygulamasından Bağlantı ekle'yi seçtiğinde etkinleştirmek istediğiniz uygulamanızın tam sınıf adı.
inviteContactActionLabel
-
inviteContactActivity
içinde, Bağlantı ekle menüsünde belirtilen etkinlik için görüntülenen metin dizesi. Örneğin, "Ağımda izle" dizesini kullanabilirsiniz. Bu etiket için dize kaynağı 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. Uygulamanızın veri yoğun işlemleri ihtiyaç duyulana kadar ertelemesine olanak tanır. Örneğin, uygulamanız, kişinin yüksek çözünürlüklü fotoğrafını ve en son sosyal akış öğelerini okuyup görüntüleyerek bu bildirime yanıt verebilir. Bu özellik, Sosyal akış etkileşimleri bölümünde daha ayrıntılı olarak açıklanmıştır.
viewGroupActivity
- Uygulamanızda grup bilgilerini görüntüleyebilen bir etkinliğin tam nitelikli sınıf adı. Kullanıcı, cihazın kişiler uygulamasında grup etiketini tıkladığında bu etkinliğin kullanıcı arayüzü görüntülenir.
viewGroupActionLabel
-
Kişiler uygulamasının, kullanıcının uygulamanızdaki gruplara bakmasına izin veren bir kullanıcı arayüzü denetimi için görüntülediği etiket.
Bu özellik için dize kaynağı tanımlayıcısına izin verilir.
viewStreamItemActivity
- Kullanıcı ham kişi için bir akış öğesini tıkladığında cihazın kişiler 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şiler uygulamasının başlattığı uygulamanızdaki bir etkinliğin tam nitelikli adı.
<ContactsDataKind> öğesi
<ContactsDataKind>
öğesi, kişiler uygulamasının kullanıcı arayüzünde uygulamanızın özel veri satırlarının görüntülenmesini kontrol eder. Aşağıdaki söz dizimine sahiptir:
<ContactsDataKind android:mimeType="MIMEtype" android:icon="icon_resources" android:summaryColumn="column_name" android:detailColumn="column_name">
şunu içeriyor:
<ContactsAccountType>
Açıklama:
Kişiler uygulamasının, ham kişinin ayrıntılarının bir parçası olarak özel veri satırı içeriklerini görüntülemesini sağlamak için bu öğeyi kullanın. <ContactsAccountType>
öğesinin her <ContactsDataKind>
alt öğesi, senkronizasyon bağdaştırıcınızın ContactsContract.Data
tablosuna eklediği özel veri satırı türünü temsil eder. Kullandığınız her özel MIME türü için bir <ContactsDataKind>
öğesi ekleyin. Verilerini görüntülemek istemediğiniz özel bir veri satırınız varsa öğeyi eklemeniz gerekmez.
Özellikler:
android:mimeType
-
ContactsContract.Data
tablosundaki özel veri satırı türlerinizden biri için tanımladığınız özel MIME türü. Örneğin,vnd.android.cursor.item/vnd.example.locationstatus
değeri, kişinin bilinen son konumunu kaydeden bir veri satırı için özel MIME türü olabilir. android:icon
- Kişiler uygulamasının verilerinizin yanında gösterdiği bir Android çekilebilir kaynağı. Kullanıcıya verilerin hizmetinizden geldiğini belirtmek için bunu kullanın.
android:summaryColumn
- Veri satırından alınan iki değerden ilkinin sütun adı. Değer, bu veri satırı için girişin ilk satırı olarak gösterilir. İlk satır, verilerin bir özeti olarak kullanılması amaçlanmıştır ancak isteğe bağlıdır. android:detailColumn bölümüne de bakın.
android:detailColumn
-
Veri satırından alınan iki değerden ikincisinin sütun adı. Değer, bu veri satırı için girişin ikinci satırı olarak gösterilir. Ayrıca
android:summaryColumn
politikasına bakın.
Ek Kişi Sağlayıcı özellikleri
Kişi Sağlayıcısı, önceki bölümlerde açıklanan ana özelliklerin yanı sıra kişi verileriyle çalışmak için şu yararlı özellikleri 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ünün senkronizasyon bağdaştırıcısının, grup verilerini Kişi Sağlayıcı ile sunucu arasında aktarması gerekir. Kullanıcılar sunucuya yeni bir kişi ekleyip ardından bu kişiyi yeni bir gruba yerleştirdiğinde, senkronizasyon bağdaştırıcısının yeni grubu ContactsContract.Groups
tablosuna eklemesi gerekir. Ham kişinin ait olduğu grup veya gruplar, ContactsContract.CommonDataKinds.GroupMembership
MIME türü kullanılarak ContactsContract.Data
tablosunda depolanır.
Sunucudan ham kişi verilerini Kişi Sağlayıcı'ya ekleyecek 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 bildirmeniz gerekir. Bir kullanıcı cihaza hesap eklediğinde yürütülen kodda, Kişi Sağlayıcı'nın hesap için eklediği ContactsContract.Settings
satırını güncelleyin. Bu satırda, Settings.UNGROUPED_VISIBLE
sütununun değerini 1 olarak ayarlayın. Bunu yaptığınızda, grup kullanmasanız bile Kişi Sağlayıcı kişi verilerinizi her zaman görünür hale getirir.
Kişi fotoğrafları
ContactsContract.Data
tablosu, fotoğrafları Photo.CONTENT_ITEM_TYPE
MIME türünde satırlar olarak depolar. Satırın CONTACT_ID
sütunu, ait olduğu ham kişinin _ID
sütununa bağlıdır.
ContactsContract.Contacts.Photo
sınıfı, kişinin birincil ham kişisinin birincil fotoğrafı olan birincil fotoğrafının fotoğraf bilgilerini içeren ContactsContract.Contacts
öğesinin bir alt tablosunu tanımlar. Benzer şekilde, ContactsContract.RawContacts.DisplayPhoto
sınıfı ham kişinin birincil fotoğrafının fotoğraf bilgilerini içeren ContactsContract.RawContacts
alt tablosunu tanımlar.
ContactsContract.Contacts.Photo
ve ContactsContract.RawContacts.DisplayPhoto
referans dokümanlarında, fotoğraf bilgilerinin alınmasına dair örnekler yer almaktadır. Ham kişinin birincil küçük resmini almak için kolaylık sağlayan bir 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ütunlarını seçerek ContactsContract.Data
tablosuna sorgu gönderebilirsiniz.
Bir kişinin sosyal akış verilerinde fotoğraflar da bulunabilir. Bunlar, Sosyal akış fotoğrafları bölümünde daha ayrıntılı olarak açıklanan android.provider.ContactsContract.StreamItemPhotos tablosunda depolanır.