Intereting Posts
Слияние манифеста Android – Различные действия запуска из проекта библиотеки Emulate Back Button с наложением в Android На основе клиента Android Resting от Virgil Dobjanschi, используя приложение AbstractThreadedSyncAdapter для отдыха Android в промышленной встроенной среде Почему Marquee не работает в виджетах? Android: как добавить контакт на SIM-карту с помощью SDK? Windows – менеджер Android SDK не перечисляет какие-либо платформы или пакеты для установки Как изменить значок приложения по умолчанию на экране проверки подлинности входа в Facebook Какова типичная структура компоновки активности настроек Android? Разрешить стили стилизовать Неудачная ошибка связи при инициализации Myo hub на Android Как изменить ключевой фон любого ключа в мягкой клавиатуре Android Скрыть контрольную панель области уведомлений в андроиде, когда 100% завершено Невозможно включить заголовки C ++, такие как вектор в Android NDK Добавлять элементы поверх списка Android

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

Я пытаюсь заставить пользовательский ContentProvider отображаться под Data & synchronization, и у меня возникают некоторые проблемы. А именно, он не появляется.

Специфика:

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

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

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

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

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

Однако ваша реальная проблема – ваш XML. Для AndroidManifest.xml docs ,

android:name

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

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

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