2012-05-25 12 views
9

Następująca metoda systematycznie zgłasza wyjątek IOException po wywołaniu na moim urządzeniu z Androidem, podczas gdy połączenie internetowe jest żywe (mogę pobierać wiadomości e-mail lub połączyć się z Gmailem za pomocą mojego urządzenia z systemem Android).Wyjątek IOException przez AccountManagerFuture.getResults podczas połączenia jest żywy

Czy ktoś może pomóc?

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

Edycja: Oto ślad stosu:

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) 

dostarczane słoiki:

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 

Odpowiedz

7

AccountManager jest konwersja żadnych błędów sieciowych w IOException wieku. Błąd sieci może być nieoczekiwanym stanem HTTP, więc może nie być bezpośrednio związany z połączeniem sieciowym. Zauważ, że AccountManager obsługuje niektóre, ale nie wszystkie tokeny typu "oauth2:", więc mogą być powiązane. Spróbuj z tokenem, który jest znany z obsługi. Spójrz również na logcat, aby uzyskać wskazówki, mogą tam być pewne ostrzeżenia. Czy to jest pełny ślad stosu?

Działa to na GN 4.0.4 (zauważ, że jest za pomocą systemu AccountManager nie 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); 

Edycja: Oto, co otrzymuję podczas kopiowania token typ z Twojego postu:

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

Ponownie, to może być moja przeglądarka albo smth, by sprawdzić ciąg (zwł. Ostatnia część)

+0

BTW, to działa dobrze na moim Galaxy Nexus (4.0.4), ale wydaje się, że jakiś dziwny charakter s w swoim typie tokena. Może to być tylko błąd kopiuj-wklej, ale ponownie wpisz ciąg i upewnij się, że jest to tylko ASCII na wszelki wypadek. –

+0

Dzięki za odpowiedź Nikolay, próbowałem usunąć część "oauth2:" w adresie URL i otrzymałem zerowy token. Czy możesz wyjaśnić dziwne postacie w typie tokena? Nie rozumiem, co masz na myśli. Jeśli chodzi o ostrzeżenia, otrzymuję to również: "GoogleLoginService: status 200, ale odpowiedź nie zawiera tokena autoryzacji". Dowolny pomysł? – balteo

+0

Czasami otrzymuję następujące ostrzeżenie: "IInputConnectionWrapper showStatusIcon na nieaktywnym połączeniu Input" – balteo