2011-12-15 2 views
6

Я создаю пользовательский Android SyncAdapter и ударяю об ошибке после примера SDK «SampleSyncAdapter». - Я создаю свой эквивалент xml/syncadapter.xml. Вот части я запутался о:Что такое Android SyncAdapter contentAuthority и accountType?

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

The documentation of AbstractThreadedSyncAdapter состояний:

android:contentAuthority и android:accountType атрибуты указывают, какой авторитет контента и, за счет которых типы синхронизации этого адаптер служит.

Документация является циркулярной в том смысле, что она ничего не говорит, это имя еще не говорит вам. У меня создалось впечатление, что оба начнутся с имени моей компании com.acme., но оттуда я понятия не имею. Я подозреваю, что строки могут быть чем угодно, если они глобально уникальны, чтобы не противоречить каким-либо другим приложениям, которые могут находиться на одном устройстве. Я предполагаю, что это означает, что мне нужно будет использовать эти точные строки в другом месте моего кода. Тем не менее, я хотел бы знать, где мне понадобятся эти строки ?! Я попытался grep для com.android.contacts, и ранее упомянутый файл - единственное место, которое он использует, я могу найти. Поэтому невозможно рассказать, как используется contentAuthority, глядя на пример.
Если да, могу ли я поместить их в строковый ресурс и указать их по идентификатору ресурса, где это необходимо? Что именно эти атрибуты и как они используются? Есть ли лучший способ выяснить, какие значения я должен выбрать для своего приложения для этих и других полей?

+0

не дубликат, но связанный с этим вопрос [Должен ли я использовать андроид AccountManager?] (http://stackoverflow.com/a/8614699/94363) – rds

ответ

5

Чтобы понять, что власть вы должны видеть documentation of ContentProvider:

В нем говорится: «. Он идентифицирует поставщик контента для приложений сторонних разработчиков, это должно быть полным именем класса (уменьшенный к нижнему регистру), чтобы обеспечить уникальность. авторитет объявлен в органах элемента атрибут»

типа счета является идентификатором вашего Authenticator, который будет использоваться, например, с помощью клиентов 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. Полноценное имя не будет содержать «поставщик» или капитализированный блокнот. – Mitch

+0

«Для сторонних приложений ...». Это означает, что не странно, что NotePad использует заглавные буквы. – kingston

+0

и, пожалуйста, ознакомьтесь с этим: http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider – kingston

0

Андроид: contentAuthority атрибут в файле метаданных SyncAdapter syncadapter.xml должен соответствовать атрибуту android: authority для вашего объявления поставщика в вашем манифесте. Сделайте это значение именем своего приложения с добавленной к нему строкой «.provider». Это с сайта разработчика Андроида 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"/> 
Смежные вопросы