Domanda

Io sono l'implementazione di un sistema di login per un'applicazione Android utilizzando il built-in sistema di contabilità (con il AccountManager Api).

Tutto è bene su Android 2.2+, ma su Android 2.1 non tra un SyncAdapter cause si riavvia in conto schermata impostazioni (vedere http://code.google.com/p/android/issues/detail?id=5009 e AccountManager senza SyncAdapter?)

Per ovviare a questo ho implementato uno stub SyncAdapter, che restituisce solo null da IBinder onBind(Intent intent), e ha aggiunto pertinenti roba del manifesto.Questo risolve il problema reboot su Android 2.1.

Tuttavia si presenta un ulteriore problema:dopo un conto è aggiunto il sistema Android sarà, successivamente, di avviare un account di sincronizzazione.Anche se non si verificano errori (in effetti il mio SyncAdapter non fa nulla, non ha alcun modo per causare errori a meno che, con il ritorno null), l'icona di sincronizzazione rimane incollato nella barra di notifica in alto.Questo si traduce in Android sync sistema di mantenimento di un permanente wake-lock, impedendo al dispositivo di dormire.

L'account non elenco le syncable componenti del conto schermata impostazioni (sotto la 'dei Dati e la sincronizzazione di intestazione (header), e visualizza sempre 'Sync è disattivato' per lo stato di sincronizzazione nell'elenco di account (anche se l'icona è visibile nella barra delle notifiche).La disattivazione di account di sincronizzazione non rimuovere il problema.Rimuovere l'account si ferma il problema.

La mia ipotesi è che io non restituire null.Dovrei essere di ritorno di una implementazione di base di ThreadedSyncAdapter?Qualsiasi aiuto per ottenere un account di sistema non è associata sync funziona correttamente su 2.1 e 2.2+, è molto apprezzato.

È stato utile?

Soluzione 2

Ho cercato di risolvere il mio problema:non si può tornare null dal onBind il metodo di servizio - è necessario restituire il IBinder di un AbstractThreadedSyncAdapter.

Questo ha l'effetto indesiderato di aggiunta di una voce in Dati e la Sincronizzazione sezione della pagina impostazioni account, anche se il mio attuazione di AbstractThreadedSyncAdapter non fa nulla;Speravo di evitare questo.

Per riassumere, al fine di utilizzare l'account di sistema di Android, è necessario:

  • Implementare un servizio che ha un IntentFilter per android.content.SyncAdapter.
  • Questo servizio deve restituire il IBinder di un AbstractThreadedSyncAdapter attuazione da onBind metodo.
  • Quindi, questo richiede che si dispone di un ContentProvider (può essere solo uno stub implementazione), che viene indicato come il contentAuthority nel SyncAdapter file XML.
  • Questo è il lato che il ContentProvider è elencato sotto i Dati e la Sincronizzazione di intestazione della pagina impostazioni account.

Altri suggerimenti

Dal momento che questa è l'unica domanda che ho visto riguardo a questo problema, ecco un >anno di ritardo di risposta.Ho anche incontrato permanente wake-lock problema per il sistema android sincronizzare il mio account personalizzato automaticamente.

Il modo migliore per gestire questo, che richiede un minimo di codice e rende effettivamente in modo che l'account non si sincronizza, a meno che specificamente chiamati alla sincronizzazione in codice:

ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);

Ora, questo richiede che il momento in cui si crea il tuo account si chiama questo metodo statico.Considerando che il primo parametro il conto per impostare questa impostazione, il secondo parametro che viene utilizzato contentprovider autorità, e il terzo è il numero intero che quando è impostato su un numero positivo consente la sincronizzazione, quando è impostato a 0 disabilita la sincronizzazione e quando insieme a qualsiasi altra cosa ti è sconosciuto.L'autorità per l'uso si possono trovare all'interno del vostro "sync_something.xml" sotto il contentAuthority attributo, che viene utilizzato dal SyncAdapter :

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts" 
android:accountType="com.myapp.account"/> <!-- This being your own account type-->

Sopra il file xml specificato all'interno del servizio di parte del AndroidManifest.xml:

<service android:name=".DummySyncAdapterService"
        exported="true"
        android:process=":contacts">
        <intent-filter>
            <action android:name="android.content.SyncAdapter" />
        </intent-filter>
        <meta-data android:name="android.content.SyncAdapter" 
            android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
    </service>

Questo è il frammento di codice che uso per creare il mio account personalizzato all'interno del mio LoginActivity:

Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
    if (accountCreated) { 
        AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
        Bundle result = new Bundle();
        result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
        response.onResult(result);
    }
}

Gran parte di questo è che quando il sistema tenta di sincronizzare l', controlla se il servizio è syncable prima, se è impostata su false annulla la sincronizzazione.Ora non è necessario creare il proprio ContentProvider né il ContentProvider sono mostrati sotto di Dati e la Sincronizzazione. Tuttavia, è necessario avere uno stub attuazione di AbstractThreadedSyncAdapter che restituisce un IBinder all'interno è onBind metodo. E, ultimo ma non ultimo fa in modo che un utente non può attivare la sincronizzazione o utilizzare il "Sync Now" pulsante per l'account a meno che non hai aggiunto la funzionalità all'interno della vostra app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top