2015-05-12 11 views
6

Próbuję dodać nowe konto (po zalogowaniu się na konto Facebook + sprawdzanie serwera ) w AccountManager. Przepływ w tym przypadku jest tak:AccountManager - authToken jest ustawiony, ale peekAuthToken zwraca wartość null

  1. Logowanie z Facebook
  2. mam dane po zalogowaniu się odbywa i zweryfikować je z danymi mam na moim serwerze
  3. Jeśli wszystko jest w porządku , serwer odsyła auth_token (token JWT)
  4. Po podaniu danych użytkownika i auth_token tworzę konto przez AccountManager i po jego utworzeniu ustawiam authToken na .
  5. Przy następnym logowaniu, gdy użytkownik ponownie otworzy aplikację, nazywam ją getAuthToken, która najpierw próbuje uzyskać buforowany authToken przez wywołanie peekAuthToken().

Problem

w punkcie 5, peekAuthToken zwraca NULL ale to nie powinno, bo już ustawić autToken dla tego konta.

Kod

public static Bundle handleUserLogin(Context context, User user) { 
    SharedPreferences mPrefs = context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE); 
    AccountManager am = AccountManager.get(context); 
    Account account = new Account(user.getEmail(), ACCOUNT_TYPE); 
    Account[] accounts = am.getAccountsByType(ACCOUNT_TYPE); 
    boolean isNewAccount = true; 


    for (int i = 0; i < accounts.length; i++) { 
     if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) { 
      isNewAccount = false; 
      account = accounts[i]; 
      break; 
     } 
    } 

    if (isNewAccount) { 
     am.addAccountExplicitly(account, user.getPassword(), null); 
     accounts = am.getAccountsByType(ACCOUNT_TYPE); 

     for (int i = 0; i < accounts.length; i++) { 
      if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) { 
       account = accounts[i]; 
       break; 
      } 
     } 
    } 

    if (null != user.getPassword()) { 
     am.setPassword(account, user.getPassword()); 
    } 

    Cs.error(TAG, "account " + account + " token " + user.getToken()); 
    am.setAuthToken(account, user.getToken(), Authenticator.AUTHTOKEN_TYPE_FULL_ACCESS); 
    setUserData(user, account, am); 

    Bundle result = new Bundle(); 

    result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); 
    result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); 
    result.putString(AccountManager.KEY_AUTHTOKEN, user.getToken()); 
    mPrefs.edit().putString(Constants.KEY_CURRENT_USER, account.name).commit(); 

    return result; 
} 

Najpierw myślałem, że może odniesienie do mojego nowego konta nie jest prawidłowa (ex jeden z AccountManager) więc szukać uwagę ponownie.

Czy możesz podać mi informacje o tym, co robię źle lub w jaki sposób upewnić się, że authToken zostanie ustawiony dla konta?

Dziękuję

Odpowiedz

0

nie będę polegać na wyraźnej zachodzącego authToken w miejscu innym niż w AbstractThreadedAccountAuthenticator's getAuthToken() metody. Domyślam się, że authToken nie jest jeszcze buforowany, gdy go zażądasz.

Sugeruję utworzenie konta przez AccountManager.addAccountExplicitly() i odroczenie dostępu do authToken, gdy naprawdę tego potrzebujesz.

W AbstractThreadedAccountAuthenticator's getAuthToken() Proponuję zastosować logikę jak w projekcie, który stworzyłem jakiś czas temu.

  1. Zapytanie authToken poprzez AccountManager.peekAuthToken()
  2. Jeśli authToken jest ustawiony w pamięci podręcznej potem zwrócić go.
  3. Jeśli nie, zażądaj go z serwera, a następnie zapisz w pamięci podręcznej przez AccountManager.setAuthToken() i w końcu wróć.

Link: https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

nadzieję, że będzie ci pomóc:

https://github.com/dawidgdanski/AccountAuthenticatorExample

+1

Proszę podać kilka wyjaśnieniu w swojej odpowiedzi, jak również. Myślę, że mówisz o https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java? – shkschneider

Powiązane problemy