ContentProvider не будет отображаться в области данных и синхронизации - PullRequest
5 голосов
/ 11 апреля 2011

Я пытаюсь заставить пользовательский ContentProvider отображаться в разделе «Данные и синхронизация», и у меня возникают некоторые проблемы.А именно, он не отображается.

Особенности:

Мой AndroidManifest.xml имеет поставщика и службу:

<provider android:name="BooksProvider"
    android:label="ClientName Books"
    android:authorities="com.clientname.reader.books"
    android:enabled="true"
    android:exported="true"
    android:syncable="true">
    <grant-uri-permission android:pathPattern=".*" />
</provider>
<service android:name=".sync.SyncService"
     android:exported="true" android:process=":sync">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapater"
         android:resource="@xml/syncadapter" />
</service>

И res / xml / syncadapter.xml имеетследующее:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
     android:contentAuthority="com.clientname.reader.books"
     android:accountType="com.google"
     android:supportsUploading="true"
     android:userVisible="true"
/>

Просто чтобы быть в безопасности, я даже вызвал на onCreate следующее:

AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
for(Account account : accounts){
    Log.d(TAG, "Account: " + account.name);
    ContentResolver.setIsSyncable(account, Reader.AUTHORITY, 1);
}

Когда я загружаю Activity, я получаю запись adb из ContentResolver.setIsSyncable говорит о том, что учетная запись уже настроена для синхронизации, поэтому метод ничего не делает.

И все же поставщик отказывается отображаться в Настройках> Аккаунты и синхронизация> Данные исинхронизации.Есть идеи, почему?Кто-нибудь знает, как определяется, что появляется в этом разделе?

[править] Еще немного информации:

После долгих часов отладки я сталкиваюсь с этой ошибкой:

04-11 10:46:02.370: DEBUG/SyncManager(105): can't find a sync adapter for SyncAdapterType Key {name=com.clientname.reader.books, type=com.google}, removing settings for it

Также кажется, что мой класс SyncService никогда не вызывается.Я должен вызывать это сам?Ни один из примеров, которые я видел, или приложения в дикой природе сами не вызывают его, но все они также имеют компоненты аутентификации.Мысли?

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011
<meta-data android:name="android.content.SyncAdapater"
     android:resource="@xml/syncadapter" />

Кто-нибудь еще замечает ответ?

Боже, я ненавижу быть идиотом.

3 голосов
/ 13 апреля 2011

Таким образом, с точки зрения семантики, провайдеры не отображаются непосредственно в Accounts & Sync.Вместо этого отображаются учетные записи с провайдерами на их страницах с подробностями.Таким образом, поскольку вы привязываете свой SyncAdapter к учетной записи в стиле com.google, адаптер синхронизации будет отображаться в вашей учетной записи Google - наряду с «контактами», «Календарем» и «Gmail» вы должны увидеть «ClientName Books»

Однако ваша настоящая проблема - это ваш XML.По AndroidManifest.xml документы ,

android:name

Имя подкласса Service, реализующего сервис.Это должно быть полное имя класса (например, «com.example.project.RoomService»).Однако для краткости, если первый символ имени является точкой (например, «.RoomService»), он добавляется к имени пакета, указанному в

Итак, это выглядит такон не находит ваш BooksProvider класс, потому что ему нужен FQCN или относительный путь через ваши пакеты.

2 голосов
/ 07 декабря 2011

Как я наконец понял, еще одна причина, по которой ContentProvider может не отображаться на экране настроек синхронизации, связана с отсутствием разрешения android.permission.WRITE_SYNC_SETTINGS в манифесте. К сожалению, все учебные пособия, статьи и документация, которые я прочитал, пропускают этот пункт или явно не обозначены. Кроме того, платформа (протестированная на уровне API 13), по-видимому, не выдает никаких исключений разрешений - я надеюсь, что они исправят это. Надеюсь, это кому-нибудь поможет.

...