API Guides Contacts Provider (二)
Data From Sync Adapters
用戶直接輸入聯(lián)系人的數(shù)據(jù)到設(shè)備中,但是也可以通過(guò)sync adapters從服務(wù)器上獲取聯(lián)系人的數(shù)據(jù)。sync adapter 會(huì)自動(dòng)同步設(shè)備和服務(wù)器上的數(shù)據(jù)。sync adapter運(yùn)行在后臺(tái),由系統(tǒng)來(lái)控制。系統(tǒng)調(diào)用ContentResolver去管理數(shù)據(jù)。
在Android中,和sync adapter一起工作的服務(wù)器是由賬戶類型表示的。每個(gè)sync adapter和一種賬戶類型共同工作,但是它也可以同時(shí)支持多個(gè)不同的賬戶名。賬戶類型和賬戶名在Sources of raw contacts data有簡(jiǎn)要的描述。下面會(huì)有更詳細(xì)的描述,還會(huì)描述賬戶名和賬戶類型與sync adapter和服務(wù)器的關(guān)系。
賬戶類型:
? ? 標(biāo)識(shí)一個(gè)用戶用來(lái)存儲(chǔ)數(shù)據(jù)的服務(wù)器。通常情況下,用戶需要取得該服務(wù)器的認(rèn)證。例如,Google contacts是一個(gè)賬戶類型,它由google.com來(lái)標(biāo)識(shí),這個(gè)標(biāo)識(shí)就是在?AccountManager中要使用到的賬戶類型。
賬戶名:
? ? 標(biāo)識(shí)一個(gè)賬戶,或用來(lái)登入到某個(gè)類型。Google contacts的賬戶名和Google的賬戶名一樣,使用郵件地址作為賬戶名。其他的服務(wù)器可能只使用字母或數(shù)字作為用戶名。
賬戶類型不需要唯一的。用戶可以配置多個(gè)Google contact的賬戶,并下載它們的數(shù)據(jù)到Contacts Provider。例如,用戶有一個(gè)私人的賬戶名,用來(lái)存儲(chǔ)私人的聯(lián)系人數(shù)據(jù);還有另一個(gè)工作的賬戶名,用來(lái)存儲(chǔ)工作的聯(lián)系人。賬戶名+賬戶類型一起標(biāo)識(shí)一組特定的聯(lián)系人數(shù)據(jù),這組數(shù)據(jù)可以在contacts provider和服務(wù)器上同步。
如果你想要下載你自己服務(wù)器上的數(shù)據(jù)到contacts provider,你需要自己寫一個(gè)sync adapter。在Contacts Provider Sync Adapters中有更多關(guān)于這方面的描述。
下圖展示了Contacts Provider如何橋接聯(lián)系人的數(shù)據(jù)。每個(gè)sync adapter都用它的賬戶類型來(lái)標(biāo)記。
Required Permissions
如果想要訪問(wèn)Contacts Provider,需要以下權(quán)限:
讀取一個(gè)或多個(gè)表:
? ??READ_CONTACTS,在?AndroidManifest.xml文件中,使用<uses-permission>標(biāo)簽定義。例如:?<uses-permission android:name="android.permission.READ_CONTACTS">。
寫入一個(gè)或多個(gè)表:
? ??WRITE_CONTACTS,在?AndroidManifest.xml文件中,使用<uses-permission>標(biāo)簽定義。例如:<uses-permission android:name="android.permission.WRITE_CONTACTS">
這些權(quán)限并不對(duì)用戶配置文件數(shù)據(jù)起作用。用戶配置文件和其權(quán)限會(huì)來(lái)接下來(lái)的The User Profile章節(jié)中討論。
記住,用戶的聯(lián)系人數(shù)據(jù)是私人的,并且是敏感的。用戶會(huì)在意他們的隱私,他們不愿意讓任意程序收集他們個(gè)人或聯(lián)系人的信息。如果你沒(méi)有明確告知用戶,為何需要訪問(wèn)聯(lián)系人的權(quán)限,他們可能會(huì)給你的應(yīng)用低的評(píng)價(jià)或簡(jiǎn)單的拒絕安裝。
The User Profile
在ContactsContract.Contacts表中,有一行保存用戶的配置文件數(shù)據(jù)。這行數(shù)據(jù)用來(lái)描述用戶的信息,而不是聯(lián)系人的信息。這行用戶配置文件為每個(gè)心痛關(guān)聯(lián)一條raw contact的數(shù)據(jù)。每行raw contact可以擁有多條的data數(shù)據(jù)。在ContactsContract.Profile中定義了訪問(wèn)用戶配置文件的相關(guān)常量。
訪問(wèn)用戶配置文件數(shù)據(jù)需要特殊的權(quán)限。除了?READ_CONTACTS和WRITE_CONTACTS用來(lái)讀寫聯(lián)系人外,還需要android.Manifest.permission#READ_PROFILE和 android.Manifest.permission#WRITE_PROFILE權(quán)限。
你必須記住,用戶的配置文件數(shù)據(jù)是敏感的。android.Manifest.permission#READ_PROFILE權(quán)限允許你訪問(wèn)私人數(shù)據(jù)。一定要在你的應(yīng)用描述中告訴用戶你為何需要訪問(wèn)用戶的個(gè)人配置文件數(shù)據(jù)。
使用?ContentResolver.query()方法去查詢包含用戶配置文件數(shù)據(jù)的一行聯(lián)系人數(shù)據(jù)。把CONTENT_URI設(shè)進(jìn)去,并且不要任何過(guò)濾條件。你也可以用這個(gè)URI用為基準(zhǔn)uri,來(lái)查詢r(jià)aw contact或data的數(shù)據(jù)。例如,下面的代碼片段用來(lái)查詢用戶的配置文件數(shù)據(jù):
// Sets the columns to retrieve for the user profile mProjection = new String[]{Profile._ID,Profile.DISPLAY_NAME_PRIMARY,Profile.LOOKUP_KEY,Profile.PHOTO_THUMBNAIL_URI};// Retrieves the profile from the Contacts Provider mProfileCursor =getContentResolver().query(Profile.CONTENT_URI,mProjection ,null,null,null);注意:如果你查詢多行contact數(shù)據(jù),你想要檢測(cè)一下某行是否為用戶配置文件數(shù)據(jù),使用 IS_USER_PROFILE ?列,這一列值為1的話,就是用戶配置文件。
Contacts Provider Metadata
Contents Provider在數(shù)據(jù)庫(kù)中存儲(chǔ)跟蹤聯(lián)系人狀態(tài)的數(shù)據(jù)。數(shù)據(jù)庫(kù)中的元數(shù)據(jù)存儲(chǔ)在很多個(gè)地方,包括raw contacts,data,contacts,ContactsContract.Settings和?ContactsContract.SyncState等表中。下面的表格展示了一些數(shù)據(jù)表的功能:
| ContactsContract.RawContacts | DIRTY | "0" -從上次同步后,沒(méi)有改變. | 標(biāo)記raw contacts在設(shè)備上已經(jīng)修改,需要同步到服務(wù)器。當(dāng)應(yīng)用程序更新一條raw contact數(shù)據(jù)的時(shí)候,Contacts Provider會(huì)自動(dòng)修改這個(gè)值。 Sync adapters 修改raw contact 或者data表的時(shí)候,需要把CALLER_IS_SYNCADAPTER加入到他們使用的URI中。這樣,provider才不會(huì)把這些修改編輯成dirty。否則,sync同步到本地?cái)?shù)據(jù),又會(huì)被回傳到服務(wù)器,即使這個(gè)修改是由服務(wù)器發(fā)起的。 |
| "1" - 在上次同步后,數(shù)據(jù)有改變。需要同步到服務(wù)器 | |||
| ContactsContract.RawContacts | VERSION | 這一行的版本號(hào) | 當(dāng)這一行或其關(guān)聯(lián)的數(shù)據(jù)發(fā)生改變時(shí),Contacts Provider會(huì)自動(dòng)增加這個(gè)值。 |
| ContactsContract.Data | DATA_VERSION | 這一行的版本號(hào) | 當(dāng)這一行或其關(guān)聯(lián)的數(shù)據(jù)發(fā)生改變時(shí),Contacts Provider會(huì)自動(dòng)增加這個(gè)值。 |
| ContactsContract.RawContacts | SOURCE_ID | 指向創(chuàng)建這個(gè)raw contact的賬戶 | 當(dāng)sync adapter創(chuàng)建一個(gè)raw contact的時(shí)候,這一列被設(shè)置成服務(wù)器可以唯一識(shí)別的ID。當(dāng)Android的應(yīng)用創(chuàng)建一個(gè)raw contact的時(shí)候,應(yīng)用程序要把這一列放空。這樣子告訴sync adapter需要在服務(wù)器上創(chuàng)建一個(gè)新的raw contact,并給它一個(gè)SOURCE_ID。 唯一性:一個(gè)賬戶的每一行數(shù)據(jù)都需要 擁有它自己的source ID,如果不強(qiáng)制這樣做,在聯(lián)系人的應(yīng)用中就會(huì)引出問(wèn)題。注意,相同賬戶類型的兩個(gè)raw contact可能會(huì)有相同的source ?id。例如,emily.dickinson@gmail.com?賬戶中的一行記錄Thomas Higginson的數(shù)據(jù),可以和?emily.dickinson@gmail.com賬戶中的另一行Thomas Higginson擁有相同的source ID。 固定性:在服務(wù)器上,每個(gè)raw contact的source id的值是不變的。如果用戶在設(shè)備的設(shè)置菜單中清楚所有聯(lián)系人數(shù)據(jù),然后再?gòu)姆?wù)器上同步,每個(gè)raw contact得到相同的source ID和刪除前是一樣的。如果你沒(méi)有強(qiáng)制要求固定性,快捷方式將不能工作。 |
| ContactsContract.Groups | GROUP_VISIBLE | "0" - 在Android的應(yīng)用中,這一組中的聯(lián)系人不可見(jiàn)。 | 為了兼容侮辱器,可以隱藏某些組的功能。 |
| "1" -在Android的應(yīng)用中,這一組中的聯(lián)系人可見(jiàn)。 | |||
| ContactsContract.Settings | UNGROUPED_VISIBLE | "0" - 在這個(gè)賬戶名和賬戶類型中,不屬于任何組的聯(lián)系人,在Android應(yīng)用程序中,不可見(jiàn)。 | 默認(rèn)情況下,如果contacts的所有raw contact數(shù)據(jù)都不屬于任何一個(gè)組,則這條contact不可教案。raw contact的組用由一行或多行?ContactsContract.Data中的ContactsContract.CommonDataKinds.GroupMembership?標(biāo)記的。通過(guò)在?ContactsContract.Settings?設(shè)置UNGROUPED_VISIBLE的值,可以強(qiáng)制讓無(wú)組的聯(lián)系人顯示或不顯示。 |
| "1" - 在這個(gè)賬戶名和賬戶類型中,不屬于任何組的聯(lián)系人,在Android應(yīng)用程序中,可見(jiàn)。 | |||
| ContactsContract.SyncState | (all) | 這個(gè)表用來(lái)存儲(chǔ)sync adapter的元數(shù)據(jù)。 | 可以在設(shè)備中存儲(chǔ)同步狀態(tài)或其他同步相關(guān)的數(shù)據(jù)。 |
總結(jié)
以上是生活随笔為你收集整理的API Guides Contacts Provider (二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 博客整理002-KICAD生成gerbe
- 下一篇: DMX512标准发送及代码整理