2016-12-24 1 views
0

J'utilise un compte de gestionnaire de compte dans un service (qui étend FirebaseInstanceIdService). S'il n'y a pas de compte valide, j'ajoute le compte en utilisant accountManager.addAccount.Android AccountManager addAccount du service

Cela prend comme une activité de paramètre (qui est utilisée pour démarrer l'activité de connexion au compte). Cependant, comme j'appelle addAccount à partir d'un service, je n'ai pas d'activité en cours à y placer. Comment puis-je appeler addAccount à partir d'un service et l'obtenir pour afficher la connexion au compte si nécessaire?

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

édité pour montrer du code pour illustrer le problème – Nathan

Répondre

0

addAccount() Cette méthode requiert une instance d'activité pour appeler l'activité d'authentification par défaut.

Leur est une autre méthode appelée addAccountExplicitly() dans la classe AccountManager. Voici la documentation:

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

Utilisation:

Créer une instance de compte:

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

métadonnées de compte Initialiser:

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

Appel méthode addAccountExplicitly():

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

Ce sera bon à faire. Bonne chance!

+0

Merci pour votre aide. J'aurais dû dire que s'il n'y a pas de comptes configurés et qu'un nouveau compte a besoin d'être ajouté, je souhaite que l'activité d'authentification soit ouverte pour que l'utilisateur saisisse ses informations d'identification. addAccount est idéal lorsque le besoin d'un compte se produit dans une autre activité, mais je ne peux pas déterminer comment obtenir une instance d'activité lorsque le besoin d'un compte se produit à partir d'un service. – Nathan

+0

Pour cela, je recommande de démarrer l'activité vous-même en utilisant l'intention du service si la taille du tableau des comptes est zéro. Pas besoin de s'appuyer sur la méthode addAccount() car en fin de compte votre méthode addAccount() sera appelée dans l'activité Authenticator. –