2017-09-20 5 views
0

Je souhaite récupérer un jeton d'utilisateur. Voici mon code:Problème AccountManagerFuture

 AccountManager am = AccountManager.get(mActivity); 

     AccountManagerFuture<Bundle> bundleAccountManagerFuture = am.getAuthTokenByFeatures(ACCOUNT_TYPE, AUTHORIZATION_TOKEN_TYPE, null, mActivity, null, null, null, null); 

     try { 
      Bundle result = bundleAccountManagerFuture.getResult(30, TimeUnit.SECONDS); 

      if (result!=null) { 
       OTTCache.getInstance().authToken = result.getString(AccountManager.KEY_AUTHTOKEN); 
      } 
     } catch (OperationCanceledException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (AuthenticatorException e) { 
      e.printStackTrace(); 
     } 

Mais l'arrêt de processus dans cette ligne:

Bundle result = bundleAccountManagerFuture.getResult(); 

Une certaine idée?

Merci beaucoup

Exception:

android.accounts.OperationCanceledException W/System.err: à android.accounts.AccountManager $ AmsTask.internalGetResult (AccountManager.java:1985) W/System.err: à android.accounts.AccountManager $ AmsTask.getResult (AccountManager.java:1997) W/System.err: à android.accounts.AccountManager $ AmsTask.getResult (AccountManager.jav a: 1995) W/System.err: à com.fr.apps.cliente.tv.task.LoginTask.doInBackground (LoginTask.java:83) W/System.err: à com.fr.apps. cliente.tv.task.LoginTask.doInBackground (LoginTask.java:25) W/System.err: à l'adresse android.os.AsyncTask $ 2.call (AsyncTask.java:304) W/System.err: à java. util.concurrent.FutureTask.run (FutureTask.java:237) W/System.err: à android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:243) W/System.err: à java. util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133) W/System.err: au java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:607) W/System.err: à java.lang.Thread.run (Thread.java:761)

+0

Je pense que le résultat est null.So ses arrêts là. – Anonymous

+0

Mais bundleAccountManagerFuture a des comptes, il n'est pas vide – Patrick

+0

Mais ce que vous voulez montrer? Il va juste exécuter ce morceau de code non – Anonymous

Répondre

0

Utilisation getResult() tente de faire appel à la variable et le code continue immédiatement. Je suppose que vous essayez de le récupérer à partir d'un serveur ou quelque chose, plutôt que d'être stocké sur l'appareil? Dans ce cas, vous devez attendre que .isDone() (android doc here) devienne true avant de traiter le résultat.

0

De Documentation AccountManagerFuture pour la méthode .getResult() -

Ce * appel bloquera jusqu'à ce que le résultat est disponible. Afin de vérifier si le résultat est * disponible sans blocage, on peut appeler {@link #isDone()} et {@link #isCancelled()}.

EDIT 1: Vous pouvez utiliser getResult(long timeout, TimeUnit unit) qui expire au bout d'un temps déterminé si la demande est bloquée. Après cela, vous pouvez vérifier si la tâche a été effectuée avec succès ou non en utilisant .isDone() et en conséquence, continuez.

+0

bundleAccountManagerFuture.isDone() et bundleAccountManagerFuture.isCancelled() sont faux. Que dois-je faire? – Patrick

+1

Vous pouvez utiliser le délai d'attente qui est une autre variation de cette fonction. Après cette méthode, vous devez vérifier si cela a été fait ou non. Ensuite, gérer le cas. Cela empêchera le programme d'être bloqué sur cette déclaration. –

+0

Je mets le timeout et maintenant jette catch (OperationCanceledException e) { – Patrick

0

Je trouve le problème:

Le nom du package de ma demande ne correspondent pas exactement avec le nom du package de mon autre application (Cette application a le login). Maintenant, j'ai signé les deux avec la même clé.