2011-12-15 9 views
6

Sto creando un SyncAdapter Android personalizzato e ho subito un problema con l'esempio SDK "SampleSyncAdapter". - Sto creando il mio equivalente dello xml/syncadapter.xml. Ecco le parti sono confuso su:Cosa sono i contenuti di Android SyncAdapterAuthority e accountType?

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

I documentation of AbstractThreadedSyncAdapter stati:

Il android:contentAuthority e android:accountType attributi indicano che l'autorità di contenuti e per i quali rappresentano i tipi di questo adattatore di sincronizzazione serve.

La documentazione è circolare in quanto non dice nulla che il nome non già ti dice. Ho l'impressione che entrambi inizieranno con il nome della mia azienda com.acme. ma da lì non ho idea. Sospetto che le stringhe possano essere qualsiasi cosa, purché siano globalmente uniche per non entrare in conflitto con altre app che potrebbero trovarsi sullo stesso dispositivo. Presumo che questo significhi che avrò bisogno di usare queste stringhe esatte altrove nel mio codice. Tuttavia, mi piacerebbe sapere, dove avrò bisogno di queste stringhe ?! Ho provato a grep per com.android.contacts e il file menzionato in precedenza è l'unico posto in cui viene utilizzato, posso trovarlo. Quindi è impossibile capire come viene utilizzato lo contentAuthority guardando l'esempio.
In tal caso, posso inserirli entrambi in una risorsa stringa e farli riferimento in base all'ID risorsa dove necessario? Quali sono esattamente questi attributi e come vengono utilizzati? C'è un modo migliore per capire quali valori dovrei scegliere per la mia applicazione per questi e altri campi?

+0

Non un duplicato ma correlata domanda [Dovrei usare AccountManager Android?] (http://stackoverflow.com/a/8614699/94363) – rds

risposta

5

Per capire che cosa l'autorità è necessario per vedere il documentation of ContentProvider:

Esso afferma:. "Identifica il fornitore di contenuti per applicazioni di terze parti, questo dovrebbe essere un nome di classe pienamente qualificato (ridotta a minuscole) al fine di garantire l'unicità. l'autorità è dichiarato nelle autorità del elemento di attributo"

il tipo di account è un identificatore del vostro Authenticator che verrà utilizzato per esempio per i clienti del AccountManager chiamare getAccountsByType(String).

Per la SampleSyncAdapter:

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

android: accountType è lo stesso di quello definito dal autenticatore.

Quindi content-Authority specifica quale provider di contenuti verrà sincronizzato localmente e accountType specifica quale autenticatore verrà utilizzato per accedere ai dati in remoto. L'accountType viene anche utilizzato per ottenere il contenuto specifico della scheda di sincronizzazione-uri.

Per esempio quando si desidera avviare una sincronizzazione è necessario chiamare requestSync come questo:

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

Allo stesso tempo per costruire il contenuto-uri per la scheda di sincronizzazione si può usare qualcosa di simile a:

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

Date un'occhiata a android-sync-adapter


Nel frattempo, la documentazione ContentProvider menzionata in precedenza è stata rivista. I latest version afferma:

Progettare un'autorità

Un provider di solito ha una sola autorità, che serve come il suo nome Android-interno. Per evitare conflitti con altri provider, è necessario utilizzare dominio Internet (al contrario) come base dell'autorità del provider . Poiché questo consiglio vale anche per i nomi dei pacchetti Android , è possibile definire l'autorizzazione del provider come estensione del nome del pacchetto che contiene il provider. Per esempio , se il nome del pacchetto Android è com.example.<appname>, è che deve fornire al proprio provider l'autorizzazione com.example.<appname>.provider.

+0

Non penso che sia corretto. Ecco perché. L'utilizzo di un nome di classe completo in minuscolo contraddice l'esempio di blocco note AUTHORITY ("com.google.provider.NotePad"). Il contenutoAuthority è per un SyncAdapter. Il nome completo non conterrà "provider" né un Blocco note in maiuscolo. – Mitch

+0

"Per applicazioni di terze parti ...". Significa che non è strano che il NotePad utilizzi le lettere maiuscole. – kingston

+0

e si prega di dare un'occhiata a questo: http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider – kingston

0

L'attributo android: contentAuthority nel file di metadati SyncAdapter syncadapter.xml deve corrispondere all'attributo android: autorità per la dichiarazione del provider nel manifesto. Apporta questo valore al nome del pacchetto dell'app con la stringa ".provider" aggiunto ad esso. Questo è dal sito degli sviluppatori di Android http://developer.android.com/training/sync-adapters

Quindi nel tuo manifesto:

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

E nel tuo 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"/>