2012-05-25 9 views
9

El siguiente método arroja sistemáticamente una IOException cuando se invoca en mi dispositivo Android mientras la conexión a Internet está activa (puedo recuperar correos electrónicos o conectarme a gmail usando mi dispositivo Android).IOException lanzado por AccountManagerFuture.getResults mientras la conexión está activa

¿Alguien puede ayudarnos?

private void performAuthentication() { 
    Log.d("GAWidget", "performAuthentication"); 
    GoogleCredential credential = new GoogleCredential(); 
    GoogleAccountManager accountManager = new GoogleAccountManager(this); 
    Log.d("GAWidget", "after getting accountManager"); 
    Account account = accountManager.getAccountByName("[email protected]"); 
    Log.d("GAWidget", "after getting account"+"account.name: "+account.name); 
    accountManager.getAccountManager().getAuthToken(account, "oauth2:https://www.googleapis.com/auth/‌​analytics.readonly", 
      true, new AccountManagerCallback<Bundle>() { 

       public void run(AccountManagerFuture<Bundle> future) { 
        try { 
         String token = future.getResult(15, TimeUnit.SECONDS).getString(AccountManager.KEY_AUTHTOKEN); 
         Log.d("GAWidget", "token: "+token); 
         useToken(token); 
        } catch (OperationCanceledException e) { 
         Log.e("GAWidget", "OperationCanceledException", e); 
        } catch (AuthenticatorException e) { 
         Log.e("GAWidget", "AuthenticatorException", e); 
        } catch (IOException e) { 
         Log.e("GAWidget", "IOException", e); 
        } 
       } 

      }, null); 
} 

Editar: Aquí está el seguimiento de la pila:

05-27 19:09:04.319: E/GAWidget(12487): IOException 
05-27 19:09:04.319: E/GAWidget(12487): java.io.IOException 
05-27 19:09:04.319: E/GAWidget(12487): at android.accounts.AccountManager.convertErrorToException(AccountManager.java:1440) 
05-27 19:09:04.319: E/GAWidget(12487): at android.accounts.AccountManager.access$400(AccountManager.java:138) 
05-27 19:09:04.319: E/GAWidget(12487): at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1301) 
05-27 19:09:04.319: E/GAWidget(12487): at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69) 
05-27 19:09:04.319: E/GAWidget(12487): at android.os.Binder.execTransact(Binder.java:320) 
05-27 19:09:04.319: E/GAWidget(12487): at dalvik.system.NativeStart.run(Native Method) 

frascos enviados:

google-http-client-1.9.0-beta.jar 
google-http-client-android2-1.9.0-beta.jar (only for SDK >= 2.1) 
google-http-client-android3-1.9.0-beta.jar (only for SDK >= 3.0) 
gson-2.1.jar 
guava-11.0.1.jar 
jackson-core-asl-1.9.4.jar 
jsr305-1.3.9.jar 
protobuf-java-2.2.0.jar 

Respuesta

7

El AccountManager es la conversión de cualquier error de red en IOException 's. Un error de red podría ser algún tipo de estado HTTP inesperado, por lo que podría no estar directamente relacionado con la conectividad de red. Tenga en cuenta que el AccountManager es compatible con algunos, pero no con todos los tokens de tipo 'oauth2:', por lo que podría estar relacionado. Pruebe con un token que se sabe que es compatible. También mira el logcat para encontrar pistas, puede haber algunas advertencias allí. ¿Es este el rastro de la pila completa?

Esto funciona en una GN 4.0.4 (nota que está utilizando el sistema AccountManager, no GoogleAccountManager):

AccountManager am = AccountManager.get(this); 
    Account[] accounts = accountManager.getAccountsByType("com.google"); 
    String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/analytics.readonly"; 
    am.getAuthToken(accounts[0], AUTH_TOKEN_TYPE, null, 
        this, new AccountManagerCallback<Bundle>() { 
         public void run(AccountManagerFuture<Bundle> future) { 
          try { 
          String token = 
future.getResult().getString(AccountManager.KEY_AUTHTOKEN); 
          System.out.println("token " + token); 
          } catch (...) {} 

          } 
         }, null); 

Editar: Esto es lo que me sale cuando se copia el tipo de token de su mensaje:

0000000: 226f 6175 7468 323a 6874 7470 733a 2f2f "oauth2:https:// 
0000010: 7777 772e 676f 6f67 6c65 6170 6973 2e63 www.googleapis.c 
0000020: 6f6d 2f61 7574 682f 3f3f 616e 616c 7974 om/auth/??analyt 
0000030: 6963 732e 7265 6164 6f6e 6c79 220a  ics.readonly". 

Una vez más, esto podría ser mi navegador o algo bajo, por confirmar su cadena (esp. última parte)

+0

por cierto, esto funciona muy bien en mi Galaxy Nexus (4.0.4), pero que parecen tener algún extraño personaje s en tu tipo de token Puede ser solo un error de copiar y pegar, pero vuelva a escribir la cadena y asegúrese de que sea ASCII solo por las dudas. –

+0

Gracias por su respuesta Nikolay, traté de eliminar la parte "oauth2:" en la url y obtengo un token nulo. ¿Puedes explicar los caracteres extraños en el tipo de token? No entiendo a qué te refieres. En cuanto a las advertencias, también recibo esto: "GoogleLoginService: estado 200, pero la respuesta no incluía auth token". ¿Alguna idea? – balteo

+0

A veces recibo la siguiente advertencia: "IInputConnectionWrapper showStatusIcon en InputConnection inactivo" – balteo

Cuestiones relacionadas