2011-12-15 17 views
6

Estoy creando un Android SyncAdapter personalizado y toco un inconveniente siguiendo el ejemplo del SDK "SampleSyncAdapter". - Estoy creando mi equivalente al xml/syncadapter.xml. Aquí están las piezas que estoy confundido acerca de:¿Qué son Android SyncAdapter contentAuthority y accountType?

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

Los documentation of AbstractThreadedSyncAdapter estados:

El android:contentAuthority y android:accountType atributos indicar cuál es la autoridad de contenido y para el que cuenta los tipos de este adaptador de sincronización sirve.

La documentación es circular en el sentido de que no dice nada, el nombre ya no le dice nada. Me da la impresión de que ambos comenzarán con el nombre de mi empresa com.acme., pero a partir de ahí no tengo ni idea. Sospecho que las cadenas pueden ser cualquier cosa, siempre que sean únicas a nivel mundial para no entrar en conflicto con otras aplicaciones que puedan estar en el mismo dispositivo. Supongo que esto significa que tendré que usar estas cadenas exactas en otro lugar de mi código. Sin embargo, me gustaría saber, ¿dónde necesitaré estas cuerdas? Traté de grep para com.android.contacts y el archivo mencionado anteriormente es el único lugar donde se utiliza, puedo encontrar. Por lo tanto, es imposible saber cómo se usa contentAuthority al observar el ejemplo.
Si es así, ¿puedo ponerlos en un recurso de cadena y hacer referencia a ellos por ID de recurso cuando sea necesario? Exactamente, ¿cuáles son estos atributos y cómo se usan? ¿Hay alguna forma mejor de averiguar qué valores debo elegir para mi propia aplicación para estos y otros campos?

+0

No es un duplicado, pero pregunta relacionada [¿Debo usar AccountManager androide?] (http://stackoverflow.com/a/8614699/94363) – rds

Respuesta

5

para entender lo que la autoridad es lo que necesita para ver la documentation of ContentProvider:

Dice lo siguiente:. "Identifica el proveedor de contenidos para aplicaciones de terceros, esto debe ser un nombre de clase completo (reducido a minúsculas) para garantizar la unicidad. la autoridad se declara en las autoridades del elemento de atributo"

el tipo de cuenta es un identificador del autenticador que será utilizado por ejemplo por los clientes de la AccountManager llamar getAccountsByType(String).

Para el SampleSyncAdapter:

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

androide: accountType es el mismo que el definido por el autenticador.

Así que el contenido-Autoridad especifica qué proveedor de contenido se sincronizará localmente y el tipo de cuenta especifica qué autenticador se utilizará para acceder a los datos de forma remota. El tipo de cuenta también se usa para obtener el contenido-uri específico del adaptador de sincronización.

Por ejemplo cuando se desea iniciar una sincronización necesita llamar requestSync así:

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

Al mismo tiempo para construir el contenido-URI para su adaptador de sincronización se puede usar algo como:

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

Tenga una mirada a android-sync-adapter


Mientras tanto, se ha revisado la documentación de ContentProvider mencionada anteriormente. Los latest version estados:

Diseñar una autoridad

Un proveedor por lo general tiene una sola autoridad, que sirve como su nombre Android-interno. Para evitar conflictos con otros proveedores, usted debe usar la propiedad del dominio de Internet (al revés) como la base de su autoridad de proveedor . Debido a que esta recomendación también es válida para los nombres de paquete de Android , puede definir la autoridad de su proveedor como una extensión del nombre del paquete que contiene el proveedor. Para ejemplo, si el nombre del paquete Android es com.example.<appname>, que debe dar su proveedor de la autoridad com.example.<appname>.provider.

+0

No creo que esto sea correcto. Este es el por qué. El uso de un nombre de clase totalmente calificado que sea minúsculo contradice el ejemplo de Notepad AUTHORITY ("com.google.provider.NotePad"). La contentAuthority es para SyncAdapter. El nombre completo no contendrá "proveedor" ni un Bloc de notas en mayúscula. – Mitch

+0

"Para aplicaciones de terceros ...". Significa que no es extraño que el Bloc de notas use letras mayúsculas. – kingston

+0

y por favor, eche un vistazo a esto: http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider – kingston

0

El atributo android: contentAuthority en su SyncAdapter archivo de metadatos syncadapter.xml debe coincidir con el androide: autoridades atribuyen para su declaración de proveedor en su Manifiesto. Haga que este valor sea el nombre del paquete de su aplicación con la cadena ".provider" añadida. Este es el sitio de desarrolladores de Android http://developer.android.com/training/sync-adapters

Así que en su Manifiesto:

<provider 
    android:name="com.example.android.datasync.provider.StubProvider" 
    android:authorities="com.example.android.datasync.provider" 
    android:exported="false" 
    android:syncable="true"/> 

Y en su 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"/>