2016-12-24 9 views
0

Я использую учетную запись менеджера аккаунта в службе (которая расширяет FirebaseInstanceIdService). Если у вас нет действительной учетной записи, я добавляю учетную запись с помощью accountManager.addAccount.Android AccountManager addAccount из службы

Это принимает за активность параметра (который используется для запуска активности входа в учетную запись). Однако, поскольку я вызываю addAccount из службы, у меня нет текущей активности для ее размещения. Как я могу вызвать addAccount из службы и заставить его отображать учетную запись в случае необходимости?

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 

    private static final String TAG = "MyFirebaseIIDService"; 

    @Override 
    public void onTokenRefresh() { 
     AccountManager accountManager = (AccountManager) getApplicationContext().getSystemService(ACCOUNT_SERVICE); 
     Account account[] = accountManager.getAccountsByType(ACCOUNT_TYPE); 
     if(account.length==0) { 
      Activity activity=???????//What can I set here 
      accountManager.addAccount(ACCOUNT_TYPE, AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, null, 
      null, activity, new AccountManagerCallback<Bundle>() { 
         public void run(AccountManagerFuture<Bundle> arg0) { 
         } 
        }, null); 
      return null; 
     } 
     //do stuff with ContentResolver using account 
    } 
} 
+0

отредактирован, чтобы показать код, чтобы проиллюстрировать проблему – Nathan

ответ

0

addAccount() метод требует экземпляр Activity для вызова по умолчанию Authenticator активность.

Их еще один метод, называемый addAccountExplicitly() в классе AccountManager. Вот документация:

/** 
    * Adds an account directly to the AccountManager. Normally used by sign-up 
    * wizards associated with authenticators, not directly by applications. 
    * <p>Calling this method does not update the last authenticated timestamp, 
    * referred by {@link #KEY_LAST_AUTHENTICATED_TIME}. To update it, call 
    * {@link #notifyAccountAuthenticated(Account)} after getting success. 
    * However, if this method is called when it is triggered by addAccount() or 
    * addAccountAsUser() or similar functions, then there is no need to update 
    * timestamp manually as it is updated automatically by framework on 
    * successful completion of the mentioned functions. 
    * <p>It is safe to call this method from the main thread. 
    * <p>This method requires the caller to have a signature match with the 
    * authenticator that owns the specified account. 
    * 
    * <p><b>NOTE:</b> If targeting your app to work on API level 22 and before, 
    * AUTHENTICATE_ACCOUNTS permission is needed for those platforms. See docs 
    * for this function in API level 22. 
    * 
    * @param account The {@link Account} to add 
    * @param password The password to associate with the account, null for none 
    * @param userdata String values to use for the account's userdata, null for 
    *   none 
    * @return True if the account was successfully added, false if the account 
    *   already exists, the account is null, or another error occurs. 
    */ 
    public boolean addAccountExplicitly(Account account, String password, Bundle userdata); 

Использование:

Создать экземпляр счета:

final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE)); 

метаданных счета Initialise:

String authtoken = //Generated Auth Token ; 
String authtokenType = //Auth Token type; 
String accountPassword= //Auth password if available; 

метод addAccountExplicitly вызова():

mAccountManager.addAccountExplicitly(account, accountPassword, //User data bundle); 
mAccountManager.setAuthToken(account, authtokenType, authtoken); 

Это будет хорошо. Удачи!

+0

Спасибо за это. Я должен был сказать, что если нет учетных записей и новая учетная запись нуждается в добавлении, я хочу, чтобы функция проверки подлинности открылась для того, чтобы пользователь мог ввести свои учетные данные. addAccount идеально подходит, когда потребность в учетной записи возникает в рамках другого действия, но я не могу решить, как получить экземпляр активности, когда потребность в учетной записи происходит из службы. – Nathan

+0

Для этого я бы рекомендовал начать свою деятельность, используя намерение службы, если размер массива учетных записей равен нулю. Не нужно полагаться на метод addAccount(), потому что в конечном итоге ваш метод addAccount() будет вызван в Activity Authenticator. –

 Смежные вопросы

  • Нет связанных вопросов^_^