ContentProvider не будет отображаться в области данных и синхронизации

Я пытаюсь сделать так, чтобы пользовательский 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);
}

Когда я загружаю действие, я получаю журнал 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 никогда не вызывается. Я должен вызывать его сам? Ни один из примеров, которые я видел, или приложения в дикой природе не вызывают его сами, но все они также имеют компоненты аутентификации. Мысли?


person Paddy    schedule 11.04.2011    source источник


Ответы (3)


<meta-data android:name="android.content.SyncAdapater"
     android:resource="@xml/syncadapter" />

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

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

person Paddy    schedule 12.04.2011
comment
Опечатки - самые раздражающие и разочаровывающие ошибки программирования! - person petersaints; 17.06.2013
comment
Даже с вашим ответом я не вижу, что было не так. Можете ли вы сделать это явным? - person rds; 04.11.2015
comment
android.content.SyncAdapater должен быть android.content.SyncAdapter - person Paddy; 06.11.2015

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

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

android:name

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

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

person jcwenger    schedule 13.04.2011
comment
Спасибо за информацию. Настоящая проблема была в опечатке. Боже, я чувствую себя глупо. Нажмите Ctrl+F в этом окне, и вы увидите его. - person Paddy; 13.04.2011

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

person Carlos N    schedule 07.12.2011