0

Je suis confronté au scénario suivant. Mon application utilise le AccountManager pour stocker les informations d'identification des utilisateurs. Il est possible d'être connecté à plus d'un compte en même temps, comme le fait Twitter (vous pouvez accéder à votre profil et passer à un autre compte connecté). Un des comptes journalisés est considéré comme actif à la fois. Jusqu'à la connaissance, la façon dont j'ai utilisé pour identifier quel compte est actuellement utilisé par l'utilisateur est de stocker le nom du compte courant dans les SharedPreferences. De cette façon, vous pouvez simplement récupérer ce nom à partir de prefs à tout moment, obtenir la liste des comptes enregistrés dans le gestionnaire de compte et répéter jusqu'à ce que vous obteniez l'objet Compte approprié. Quelque chose comme ceci:Stockez plusieurs comptes dans AccountManager et incluez un SyncAdapter

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

En outre, lors de l'exécution du SyncAdapter, son obtient la currentAccountName des préférences pour obtenir un jeton et se connecter au serveur.

Le problème est que, à partir de l'API 21, il n'est plus sûr d'accéder aux préférences de différents processus. Cela signifie que, si je stocke dans prefs le currentLoggedAccount et puis je lance un adaptateur de synchronisation, il peut ne pas obtenir le pref stocké, car son exécution dans un processus différent.

Comment gérez-vous ce scénario?

Répondre

0

J'ai également fait face à ce même problème. J'ai fait une solution de contournement en utilisant ma base de données locale. Comme j'utilise Realm dans mon application, j'ai fait une table qui agit comme SharedPreference, je les stocke comme une paire de valeur de clé. Et puis récupéré la valeur parce que comme vous l'avez dit de l'API 21, il n'est plus fiable d'accéder aux préférences de différents processus.

+0

Merci pour votre réponse Abir. Cela fonctionnera mais me semble encore être une surcharge. Créer une table SQL juste pour stocker une seule ligne d'information me fait penser qu'il doit y avoir quelque chose d'autre qui me manque. – juanmeanwhile