0

다음 시나리오를 마주하고 있습니다. 내 응용 프로그램은 AccountManager를 사용하여 사용자 자격 증명을 저장합니다. 트위터가하는 것과 마찬가지로 동시에 여러 계정에 로그인 할 수 있습니다 (프로필로 이동하여 다른 기록 된 계정으로 전환 할 수 있음). 기록 된 계정 중 하나가 한 번에 활성 상태로 간주됩니다.여러 계정을 AccountManager에 저장하고 SyncAdapter를 포함하십시오.

전까지는 사용자가 현재 사용중인 계정을 식별하는 데 사용한 방법은 현재 계정 이름을 SharedPreferences에 저장하는 것입니다. 이런 식으로 언제든지 prefs에서이 이름을 검색하고 계정 관리자에서 기록 된 계정 목록을 가져 와서 적절한 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를 저장하고 동기화 어댑터를 시작하면 다른 프로세스에서 실행되기 때문에 저장된 기본 설정을 가져 오지 못할 수 있습니다.

이 시나리오를 어떻게 처리 하시겠습니까?

답변

0

나는 또한이 동일한 문제에 직면했다. 내 로컬 DB를 사용하여 해결 방법을 만들었습니다. 내 응용 프로그램에서 Realm을 사용하여, 나는 SharedPreference의 역할을하는 테이블을 만들었고 키 값 쌍처럼 저장합니다. 그리고 API 21에서 말했듯이 다른 프로세스의 환경 설정에 액세스하는 것이 더 이상 신뢰할 수 없기 때문에이 값을 검색했습니다.

+0

감사합니다. Abir. 이것은 효과가 있지만 여전히 잔인한 느낌이 들게됩니다. 하나의 정보 행을 저장하기 위해 SQL 테이블을 작성하면 필자가 누락 된 다른 것이 있어야한다고 생각하게 만든다. – juanmeanwhile