2011-12-15 28 views
6

我正在創建一個自定義Android SyncAdapter,並按照SDK示例「SampleSyncAdapter」遇到了一個障礙。 - 我正在創建相應的xml/syncadapter.xml。這是我感到困惑的部分:什麼是Android SyncAdapter contentAuthority和accountType?

android:contentAuthority="com.android.contacts" 
android:accountType="com.example.android.samplesync" 

documentation of AbstractThreadedSyncAdapter狀態:

android:contentAuthorityandroid:accountType屬性 指出哪些內容權威,哪些帳戶類型此同步 適配器供應。

該文檔是循環的,因爲它沒有說名稱沒有告訴你。我得到的印象是,兩人都以我公司的名字com.acme.開頭,但從那裏我不知道。我懷疑這些字符串可以是任何東西,只要它們是全球唯一的,以免與可能在同一設備上的任何其他應用發生衝突。我想這意味着我需要在我的代碼中的其他地方使用這些確切的字符串。但是,我想知道,在哪裏我需要這些字符串?!我試圖grep爲com.android.contacts和前面提到的文件是唯一的地方,我可以找到它。因此,通過查看示例不可能知道如何使用contentAuthority
如果是這樣,我可以把它們都放在一個字符串資源中,並在需要時通過資源ID引用它們嗎?究竟這些屬性是什麼以及它們是如何使用的?有沒有更好的方法來弄清楚我應該爲這些和其他領域的應用選擇什麼樣的價值?

+0

不是重複,但相關的問題[我應該使用Android的AccountManager?( http://stackoverflow.com/a/8614699/94363) – rds 2011-12-23 10:14:45

回答

5

要了解權力是什麼,你需要看到documentation of ContentProvider

它指出:「它標識內容供應商對於第三方應用程序,這應該是一個完全合格的類名(減少以小寫),以確保唯一性。該署在該元素的當局宣佈屬性」

帳戶類型是你的鑑定者將由的AccountManager的客戶端使用例如調用getAccountsByType(String)的識別器。

對於SampleSyncAdapter

android:contentAuthority="com.android.contacts" 
android:accountType="com.example.android.samplesync" 

機器人:ACCOUNTTYPE是相同一個由認證定義。

因此,content-Authority指定哪個內容提供者將在本地同步,並且accountType指定將使用哪個驗證者來遠程訪問數據。 accountType也用於獲取同步適配器的特定內容-uri。

例如,當你要開始,你需要調用requestSync這樣的同步:

final Account account = new Account(accountName, ACCOUNT_TYPE); 
ContentResolver.requestSync(account, CONTENT_AUTHORITY, new Bundle()); 

同時構建內容的URI您的同步適配器,你可以使用這樣的:

Uri CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE, SyncAdapter.ACCOUNT_TYPE).build(); 

,看一下android-sync-adapter


同時,前面提到的ContentProvider文檔已被修改。該latest version狀態:

設計的權威

提供者通常有一個單一的機構,作爲其 Android平臺的內部名稱。爲避免與其他提供商發生衝突,您應使用因特網域名所有權(反向)作爲您的提供商機構的基礎。由於此建議對於Android軟件包名稱也是如此,因此您可以將您的提供者權限定義爲包含提供者的軟件包名稱的 擴展名。例如,如果您的Android包名稱爲com.example.<appname>,那麼您的 應該爲您的提供商授予權限 com.example.<appname>.provider

+0

我不認爲這是正確的。這是爲什麼。使用小寫的完全限定類名稱與記事本示例AUTHORITY(「com.google.provider.NotePad」)矛盾。 contentAuthority適用於SyncAdapter。完全限定名稱不包含「provider」,也不包含大寫的NotePad。 – Mitch 2011-12-16 03:17:11

0

SyncAdapter元數據文件syncadapter.xml中的android:contentAuthority屬性應該與您的清單中提供者聲明的android:authorities屬性相匹配。使用附加的字符串「.provider」將該值作爲應用程序的包名稱。這是Android的開發者網站http://developer.android.com/training/sync-adapters

因此,在你的清單:

<provider 
    android:name="com.example.android.datasync.provider.StubProvider" 
    android:authorities="com.example.android.datasync.provider" 
    android:exported="false" 
    android:syncable="true"/> 

而在你syncadapter.xml

<sync-adapter 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:contentAuthority="com.example.android.datasync.provider" 
    android:accountType="com.android.example.datasync" 
    android:userVisible="false" 
    android:supportsUploading="false" 
    android:allowParallelSyncs="false" 
    android:isAlwaysSyncable="true"/>