2011-04-11 3 views
5

Estoy tratando de obtener un ContentProvider personalizado para que se muestre bajo la sincronización con los datos &, y tengo algunos problemas. A saber, no aparece.ContentProvider no se mostrará en el área de Datos y Sincronización

Los detalles:

Mi AndroidManifest.xml tiene el proveedor y el servicio:

<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> 

Y res/xml/syncadapter.xml tiene las siguientes:

<?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" 
/> 

Sólo para estar seguro, incluso he llamado lo siguiente en Crear:

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); 
} 

Cuando cargo la Actividad, obtengo el registro de adb de ContentResolver.setIsSyncable diciendo que la cuenta ya está configurada para ser sincronizable, por lo que el método no está haciendo nada.

Y, sin embargo, el proveedor se niega a aparecer en Ajustes> Cuentas & sincronización> Datos & sincronización. Alguna idea sobre por qué? ¿Alguien sabe cómo está determinado lo que aparece en esa sección?

[editar] Algunos más información:

Después de pasar horas de depuración, ya voy a través de este error:

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 

También aparece mi clase SyncService está en realidad nunca recibiendo llamadas. ¿Se supone que debo invocarlo yo mismo? Ninguna de las muestras que he visto o las aplicaciones en la naturaleza lo invocan ellas mismas, pero también todas tienen componentes de autenticación. ¿Pensamientos?

Respuesta

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

¿Alguien más ha notado la respuesta?

Dios, odio ser un idiota.

+0

Los errores tipográficos son los errores de programación más molestos y frustrantes de la historia. – petersaints

+1

Incluso con su respuesta, no veo lo que estaba mal. ¿Puedes hacerlo explícito? – rds

+0

android.content.SyncAdapater debe ser android.content.SyncAdapter – Paddy

3

Por lo tanto, desde una perspectiva semántica, los proveedores no se muestran directamente en Cuentas & Sincronización. En cambio, aparecen las cuentas, con los proveedores en sus páginas de detalles. Como vincula su SyncAdapter a una cuenta de estilo com.google, el adapater de sincronización se mostrará en su cuenta de Google, junto con "contactos" y "Calendario" y "Gmail", debería ver "ClientName Books"

Sin embargo, su problema real es su XML. Por AndroidManifest.xml docs,

android:name

The name of the Service subclass that implements the service. This should be a fully qualified class name (such as, "com.example.project.RoomService"). However, as a shorthand, if the first character of the name is a period (for example, ".RoomService"), it is appended to the package name specified in the

Por lo tanto, parece que no es la búsqueda de su clase BooksProvider porque necesita el FQCN o la ruta relativa a través de sus paquetes.

+2

Gracias por la información. El verdadero problema fue un error tipográfico. Dios, me siento estúpido. Ctrl + F "adapater" en esta ventana, y lo verás. – Paddy

2

Como finalmente me di cuenta, otra razón por la que ContentProvider podría no aparecer en la pantalla de configuración de sincronización se debe a que falta un permiso android.permission.WRITE_SYNC_SETTINGS en el Manifiesto. Lamentablemente, todos los tutoriales, artículos y documentación que he leído omiten este punto o no se describen explícitamente. Además, la plataforma (probada bajo el nivel 13 de la API) no parece arrojar ninguna forma de excepción de permiso. Espero que lo solucionen. Espero que esto ayude a alguien.

Cuestiones relacionadas