0

私は以下のシナリオに直面しています。私のアプリはAccountManagerを使ってユーザーの資格情報を保存します。ツイッターのように複数のアカウントに同時にログインすることも可能です(プロフィールにアクセスして別のログに記録されたアカウントに切り替えることもできます)。記録されたアカウントの1つは、一度にアクティブと見なされます。複数のアカウントをAccountManagerに保存し、SyncAdapterを含める

分かりませんでしたが、わたしが現在どのアカウントをユーザーが使用しているかを識別するために使用した方法は、現在のアカウント名をSharedPreferencesに保存することです。このようにして、いつでもプリファレンスからこの名前を取得し、アカウントマネージャーで記録されたアカウントのリストを取得し、適切なAccountオブジェクトを取得するまで繰り返します。

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

また、SyncAdapterを実行しているときには、トークンを取得してサーバーに接続するために、環境設定からcurrentAccountNameを取得します。

問題は、API 21から異なるプロセスの環境設定にアクセスすることが安全ではないということです。これは、prefsにcurrentLoggedAccountを格納してから、同期アダプタを起動すると、別のプロセスで実行されるため、格納されたprefを取得できない可能性があることを意味します。

このシナリオをどのように処理しますか?

答えて

0

私もこの同じ問題に直面しました。ローカルDBを使用して回避策を作成しました。私はRealmを私のアプリで使っているので、私はSharedPreferenceのような役割を果たすテーブルを作りました。私はそれらをキー値のように保存しています。 API 21から言ったように、別のプロセスのプリファレンスにアクセスすることはもはや信頼できないため、値を取得しました。

+0

あなたに感謝します。これはうまくいくが、それでもやはり私には過剰なもののように感じる。単一の行の情報を格納するためだけにSQLテーブルを作成すると、私が紛失しているものが他にも存在するはずであると私は思います。 – juanmeanwhile

関連する問題