2012-05-25 13 views
9

Il seguente metodo genera sistematicamente una IOException quando viene richiamato sul mio dispositivo Android mentre la connessione Internet è attiva (posso recuperare email o connettermi a gmail usando il mio dispositivo Android).IOException generata da AccountManagerFuture.getResults mentre la connessione è attiva

Qualcuno può aiutare per favore?

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); 
} 

Edit: Ecco la traccia dello stack:

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) 

barattoli spediti:

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 

risposta

7

Il AccountManager è la conversione di tutti gli errori di rete in IOException 's. Un errore di rete potrebbe essere una sorta di stato HTTP imprevisto, quindi potrebbe non essere direttamente correlato alla connettività di rete. Si noti che il numero AccountManager supporta alcuni token di tipo "oauth2:", in modo che possano essere correlati. Prova con un token che è noto per essere supportato. Guarda anche il logcat per suggerimenti, potrebbero esserci alcuni avvertimenti lì. Questa è la traccia dello stack completo?

questo funziona su un GN 4.0.4 (nota che utilizza il sistema AccountManager, non 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); 

Edit: Ecco cosa ottengo quando si copia il tipo di token dal tuo post:

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". 

Ancora una volta, questo potrebbe essere il mio browser o si dovrebbe occupare, per verificare la stringa (esp. ultima parte)

+0

BTW, questo funziona bene sul mio Galaxy Nexus (4.0.4), ma sembrano avere qualche strano personaggio s nel tuo tipo di token. Potrebbe essere solo un errore di copia-incolla, ma ri-digitare la stringa e assicurarsi che sia ASCII solo per ogni evenienza. –

+0

Grazie per la tua risposta Nikolay, ho provato a rimuovere la parte "oauth2:" nell'url e ottengo un token nullo. Puoi per favore approfondire gli strani personaggi nel tipo di token? Non capisco cosa intendi. Per quanto riguarda gli avvertimenti, ricevo anche questo: "GoogleLoginService: stato 200 ma la risposta non include il token di autenticazione". Qualche idea? – balteo

+0

A volte viene visualizzato anche il seguente avviso: "IInputConnectionWrapper showStatusIcon su InputConnection inattivo" – balteo