0

Ich stehe vor dem folgenden Szenario. Meine App verwendet den AccountManager zum Speichern der Benutzeranmeldeinformationen. Es ist möglich, in mehreren Konten gleichzeitig angemeldet zu sein, ähnlich wie bei Twitter (Sie können zu Ihrem Profil wechseln und zu einem anderen angemeldeten Konto wechseln). Eines der angemeldeten Konten wird jeweils als aktiv betrachtet.Speichern Sie mehrere Konten im AccountManager und fügen Sie einen SyncAdapter ein

Bis ich weiß, wie ich das Konto verwendet habe, das momentan vom Benutzer verwendet wird, muss der Name des aktuellen Kontos in den SharedPreferences gespeichert werden. Auf diese Weise können Sie diesen Namen jederzeit aus den Präferenzen abrufen, die Liste der im Account Manager protokollierten Accounts abrufen und iterieren, bis Sie das richtige Account-Objekt erhalten. Etwas wie folgt aus:

String currentAccountName = SharedPreferences.get(mContext).getString(PREF_CURRENT_ACCOUNT, null); 
Account[] accounts = AccountManager.get(mContext).getAccountsByType(MY_ACCOUNT_TYPE); 
Account loggedAccount; 
for (Account account : accounts) { 
    if (account.name.equals(currentAccountName)) { 
      loggedAccount = account; 
      break; 
    } 
} 

//Get the token for this account 
String authToken = AccountManager.get(mContext).getToken(account, MY_ACCOUNT_TYPE,...).getResult().get(AccountManager.AUTH_TOKEN); 

Auch wenn die SyncAdapter ausgeführt wird, dessen die currentAccountName von Präferenzen erhält einen Token zu bekommen und mit dem Server verbinden.

Das Problem ist, dass es von API 21 nicht mehr sicher ist, auf die Einstellungen von verschiedenen Prozessen zuzugreifen. Das heißt, wenn ich currentLoggedAccount in prefs ablege und dann einen Sync Adapter starte, erhält er möglicherweise nicht die gespeicherte Pref, weil er in einem anderen Prozess ausgeführt wird.

Wie würden Sie mit diesem Szenario umgehen?

Antwort

0

Ich hatte auch das gleiche Problem. Ich habe einen Workaround mit meiner lokalen DB durchgeführt. Wie ich Realm in meiner App verwende, machte ich eine Tabelle, die als SharedPreference fungiert, ich speichere sie wie ein Schlüsselwertpaar. Und dann den Wert abgerufen, denn wie Sie von API 21 sagten, ist es nicht länger verlässlich, auf die Präferenzen von verschiedenen Prozessen zuzugreifen.

+0

Danke für Sie antworten Abir. Das wird funktionieren, fühlt sich aber immer noch wie ein Overkill für mich an. Das Erstellen einer SQL-Tabelle, nur um eine einzelne Zeile von Informationen zu speichern, lässt mich denken, dass ich etwas anderes vermissen muss. – juanmeanwhile

Verwandte Themen