Frage

Ich implementiere ein Anmeldesystem für eine Android-Anwendung, die das integrierte Kontensystem (mit dem APIs AccountManager) verwendet.

Alles ist gut und gut auf Android 2.2+, aber auf Android 2.1, das nicht ein Synkadapter enthält, verursacht Neustarts im Bildschirm der Kontoeinstellungen (siehe http://code.google.com/p/android/issues/detail?id=5009 und AccountManager ohne Synkadapter?)

Um dies zu umgehen, habe ich einen Stubsynkadapter implementiert, der nur zurückkehr null aus IBinder onBind(Intent intent), und fügte das relevante Zeug zum Manifest hinzu. Dies löst das Neustartproblem auf Android 2.1.

Es wird jedoch ein weiteres Problem eingeführt: Nachdem ein Konto hinzugefügt wurde, wird das Android -System irgendwann später eine Kontosynchronisierung einleiten. Obwohl keine Fehler auftreten (in der Tat tut mein Synkadapter nichts, hat es keine Möglichkeit, Fehler zu verursachen, es sei denn null) Das Synchronisationssymbol bleibt oben in der Benachrichtigungsleiste. Dies führt dazu, dass das Android -Synchronisationssystem a beibehält Permanente Wake-Lock, verhindern, dass das Gerät schlafen.

Das Konto listet keine synzierbaren Komponenten im Bildschirm "Kontoeinstellungen die Benachrichtigungsleiste). Durch Deaktivieren der Kontosynchronisierung wird das Problem nicht entfernt. Das Entfernen des Kontos stoppt das Problem.

Ich vermute, ich sollte nicht null zurückkehren. Sollte ich eine grundlegende Implementierung von ThreadedSyncadapter zurückgeben? Jede Hilfe, die ein Konto -System ohne eine ordnungsgemäße Synchronisierung bei 2.1 und 2.2+ ordnungsgemäß funktioniert, wird sehr geschätzt.

War es hilfreich?

Lösung 2

Ich habe mein eigenes Problem gelöst: Sie können nicht zurückkehren null von dem onBind Methode Ihres Dienstes - Sie müssen die zurückgeben IBinder von einem AbstractThreadedSyncAdapter.

Dies hat den unerwünschten Effekt des Hinzufügens eines Eintrags in den Abschnitt Daten und Synchronisation auf der Seite der Kontoeinstellungen, obwohl meine Implementierung von AbstractThreadedSyncAdapter tut nichts; Ich hatte gehofft, das zu vermeiden.

Zusammenfassend müssen Sie das Kontensystem in Android nutzen, um das Kontensystem in Android zu nutzen, müssen Sie:

  • Einen Dienst implementieren, der einen hat IntentFilter zum android.content.SyncAdapter.
  • Dieser Service muss die zurückgeben IBinder von einem AbstractThreadedSyncAdapter Implementierung von It It's onBind Methode.
  • Dies erfordert dann, dass Sie eine haben ContentProvider (kann nur eine Stub -Implementierung sein), die als die bezeichnet wird contentAuthority In Ihrer Synkadapter XML -Datei.
  • Dies hat die Herunterseite, dass Ihr ContentProvider unter den Daten- und Synchronisations-Header auf Ihrer Seite der Kontoeinstellungen aufgeführt ist.

Andere Tipps

Da dies die einzige Frage ist, die ich mit diesem Problem gesehen habe, ist hier ein Jahr spät. Ich bin auch auf das ständige Wake-Lock-Problem gestoßen, da das Android-System mein benutzerdefiniertes Konto automatisch synchronisiert hat.

Der beste Weg, dies zu behandeln, für das minimale Code erforderlich ist und tatsächlich das Konto synchronisiert wird, es sei denn, sie werden ausdrücklich aufgerufen, um im Code zu synchronisieren:

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

Dies erfordert nun, dass in dem Moment, in dem Sie Ihr Konto erstellen, diese statische Methode nennen. Während der erste Parameter das Konto ist, das diese Einstellung festgelegt hat, ist der zweite Parameter die Autorität des verwendeten ContentProviders, und das dritte ist die Ganzzahl, die beim Einstellen einer positiven Zahl das Synchronisieren ermöglicht, wenn auf 0 gesendet wird, und wenn Sie auf irgendetwas anderes eingestellt sind, deaktiviert macht es unbekannt. Die Berechtigung zur Verwendung kann in Ihrem "Sync_Something.xml" unter dem Attribut "ContentAuthority" gefunden werden, das von Ihrem Synkadapter verwendet wird:

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

Die obige XML -Datei ist im Dienst Teil Ihres AndroidManifest.xml angegeben:

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

Dies ist der Code -Snippet, mit dem ich mein benutzerdefiniertes Konto in meiner LoginActivity erstelle:

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

Der große Teil davon ist, dass, wenn das System versucht, den Dienst zu synchronisieren, überprüft, ob der Dienst zuerst synchronisiert ist, wenn es auf false eingestellt ist, die Synchronisierung storniert. Jetzt müssen Sie nicht Ihre eigenen erstellen ContentProvider Auch deine ContentProvider Werden Sie unter Daten und Synchronisation gezeigt. Sie müssen jedoch eine Stub -Implementierung von AbstractThreededsyncadapter haben, die einen Ibinder innerhalb der Onbind -Methode zurückgibt. Und nicht zuletzt macht es es so, dass ein Benutzer für dieses Konto die Synchronisierung oder die Taste "Jetzt synchronisieren" nicht aktivieren oder nicht aktivieren kann, es sei denn, Sie haben die Funktionalität in Ihrer App hinzugefügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top