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