2011-12-15 15 views
6

Tworzę niestandardowy Android SyncAdapter i trafiam w szufladkę po przykładzie SDK "SampleSyncAdapter". - Tworzę mój odpowiednik xml/syncadapter.xml. Oto części jestem zagubiony:Co to są Android SyncAdapter contentAuthority i accountType?

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

The documentation of AbstractThreadedSyncAdapter stanów:

android:contentAuthority i android:accountType atrybuty wskazać, który władzę i dla których zawartość stanowią typy to synchronizacja adapter służy.

Dokumentacja ma charakter okólny, ponieważ nie zawiera żadnych informacji, których nazwa jeszcze nie mówi. Mam wrażenie, że oba zaczną się od nazwy mojej firmy com.acme., ale nie mam pojęcia. Podejrzewam, że ciągi mogą być dowolne, o ile są unikalne na całym świecie, aby nie kolidowały z żadnymi innymi aplikacjami, które mogą znajdować się na tym samym urządzeniu. Zakładam, że oznacza to, że będę musiał użyć tych dokładnych ciągów w innym miejscu mojego kodu. Chciałbym jednak wiedzieć, gdzie będę potrzebował tych strun ?! Próbowałem grep dla com.android.contacts, a wspomniany wcześniej plik jest jedynym miejscem, w którym jest używany, mogę znaleźć. Dlatego nie można powiedzieć, w jaki sposób używa się contentAuthority, patrząc na przykład.
Jeśli tak, czy mogę umieścić je w zasobach ciągów i w razie potrzeby odwołać je według identyfikatora zasobu? Dokładnie jakie są te atrybuty i jak są używane? Czy istnieje lepszy sposób na ustalenie, jakie wartości powinienem wybrać dla mojego własnego wniosku dotyczącego tych i innych dziedzin?

+0

Nie duplikat ale powiązane pytanie [powinienem używać android AccountManager?] (http://stackoverflow.com/a/8614699/94363) – rds

Odpowiedz

5

Aby zrozumieć, co władza to trzeba zobaczyć documentation of ContentProvider:

Stwierdza: „. Identyfikuje się z dostawcą treści dla aplikacji innych firm, powinno to być w pełni kwalifikowana nazwa klasy (zredukowane do małych liter) w celu zapewnienia unikalności. władza jest zadeklarowana władzom elementu jest atrybut”

typ konta jest identyfikatorem Twojego Authenticator, które będą wykorzystywane na przykład przez klientów z AccountManager zadzwonić getAccountsByType(String).

Dla SampleSyncAdapter:

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

ANDROID ACCOUNTTYPE jest taki sam jak ten, który został zdefiniowany przez osobę uwierzytelniającą.

Tak więc Urząd treści określa, który dostawca zawartości będzie zsynchronizowany lokalnie, a parametr accountType określa, który podmiot uwierzytelniający będzie używany do zdalnego dostępu do danych. Metoda accountType służy również do uzyskania określonej treści adaptera synchronizacji - uri.

Na przykład, gdy chcesz rozpocząć synchronizację trzeba zadzwonić requestSync tak:

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

Jednocześnie zbudować Content-URI dla karty synchronizacji można użyć mniej więcej tak:

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

Mają wygląd android-sync-adapter


Tymczasem poprzednia wspomniana dokumentacja ContentProvider została zmieniona. W latest version stany:

Projektowanie organ

Operator ma zazwyczaj jeden organ, który służy jako jego nazwy Android wewnętrznego. Aby uniknąć konfliktów z innymi dostawcami, użytkownik powinien korzystać z własności domeny internetowej (w odwrotnej kolejności) jako podstawy dla swojego dostawcy usług dostawcy usług . Ponieważ to zalecenie jest również prawdziwe w przypadku nazw pakietów systemu Android o nazwie , można zdefiniować swój dostawca usługi jako rozszerzenie nazwy pakietu zawierającego dostawcę o numerze . W przypadku przykładu na numer , jeśli nazwa pakietu Android to com.example.<appname>, numer powinien przekazać usługodawcy autoryzację com.example.<appname>.provider.

+0

Nie sądzę, że to jest poprawne. Dlatego. Używanie w pełni kwalifikowanej nazwy klasy, która jest pisana małymi literami, jest sprzeczne z przykładową dokumentacją Notepad ("com.google.provider.NotePad"). ContentAuthority jest dla SyncAdapter. W pełni kwalifikowana nazwa nie zawierałaby "dostawcy" ani wielkiej litery NotePada. – Mitch

+0

"W przypadku aplikacji innych firm ...". Oznacza to, że nie jest dziwne, że NotePad używa wielkich liter. – kingston

+0

i proszę spojrzeć na to: http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider – kingston

0

Atrybut android: contentAuthority w pliku danych metadanych SyncAdapter syncadapter.xml powinien być zgodny z atrybutem android: authority dla deklaracji dostawcy w Manifeście. Ustaw tę wartość jako nazwę pakietu aplikacji z dołączonym do niej ciągiem ".provider". Jest to ze strony programistów Android http://developer.android.com/training/sync-adapters

Więc w swoim manifeście:

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

I w 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"/>