Что такое Android SyncAdapter contentAuthority и accountType? - PullRequest
6 голосов
/ 15 декабря 2011

Я создаю собственный Android SyncAdapter и попадаюсь в ловушку, следуя примеру SDK "SampleSyncAdapter".- Я создаю свой эквивалент xml/syncadapter.xml.Вот части, которые меня смущают:

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

Документация AbstractThreadedSyncAdapter сообщает:

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

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

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Чтобы понять, что такое полномочия, вам нужно ознакомиться с документацией ContentProvider :

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

Тип учетной записи - это идентификатор вашего Аутентификатора, который будет использоваться, например, клиентами AccountManager для вызова getAccountsByType(String).

Для SampleSyncAdapter :

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

android: accountType совпадает с определенным аутентификатором.

Таким образом, Content-Authority указывает, какой поставщик контента будет синхронизироваться локально, а accountType указывает, какой аутентификатор будет использоваться для удаленного доступа к данным. AccountType также используется для получения определенного содержимого URI адаптера синхронизации.

Например, если вы хотите запустить синхронизацию, вам нужно вызвать requestSync следующим образом:

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

В то же время для создания content-uri для вашего адаптера синхронизации вы можете использовать что-то вроде:

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

Посмотрите на Android-Sync-адаптер


Между тем ранее упомянутая документация ContentProvider была пересмотрена. последняя версия гласит:

Проектирование органа

Поставщик обычно имеет единственную власть, которая служит его Android-внутреннее имя. Чтобы избежать конфликтов с другими поставщиками, вы следует использовать владение интернет-доменом (в обратном порядке) в качестве основы вашего полномочия провайдера. Потому что эта рекомендация верна и для Имена пакетов Android, вы можете определить полномочия вашего провайдера как расширение имени пакета, содержащего провайдера. За Например, если имя вашего пакета Android com.example.<appname>, вы должен дать вашему провайдеру полномочия com.example.<appname>.provider.

0 голосов
/ 08 декабря 2014

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