2013-05-13 13 views
7

Mam problem z moim projektem, w którym chcę połączyć Google Cloud Endpoints z Androidem. Ja wciąż otrzymuję ten sam błąd:Błąd z punktami końcowymi w systemie Android: GoogleAuthIOException

05-12 21:50:23.995: W/System.err(17739): com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException 
05-12 21:50:23.995: W/System.err(17739): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:224) 
05-12 21:50:24.000: W/System.err(17739): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:888) 
05-12 21:50:24.000: W/System.err(17739): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:407) 
05-12 21:50:24.000: W/System.err(17739): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:340) 
05-12 21:50:24.000: W/System.err(17739): at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:458) 
05-12 21:50:24.000: W/System.err(17739): at com.example.endpointstutorial_android.MainActivity$QueryScoresTask.doInBackground(MainActivity.java:74) 
05-12 21:50:24.005: W/System.err(17739): at com.example.endpointstutorial_android.MainActivity$QueryScoresTask.doInBackground(MainActivity.java:1) 
05-12 21:50:24.005: W/System.err(17739): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
05-12 21:50:24.005: W/System.err(17739): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-12 21:50:24.005: W/System.err(17739): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-12 21:50:24.005: W/System.err(17739): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
05-12 21:50:24.005: W/System.err(17739): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-12 21:50:24.005: W/System.err(17739): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-12 21:50:24.005: W/System.err(17739): at java.lang.Thread.run(Thread.java:856) 
05-12 21:50:24.005: W/System.err(17739): Caused by: com.google.android.gms.auth.GoogleAuthException: Unknown 
05-12 21:50:24.005: W/System.err(17739): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
05-12 21:50:24.005: W/System.err(17739): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192) 
05-12 21:50:24.010: W/System.err(17739): at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:217) 
05-12 21:50:24.010: W/System.err(17739): ... 13 more` 

Mój kod Android:

public class MainActivity extends Activity { 
    private static final String PREF_ACCOUNT_NAME = "pref.account.name"; 
    public static final String AUDIENCE = "server:client_id:660102392535.apps.googleusercontent.com"; 
    SharedPreferences settings; 
    GoogleAccountCredential credential; 
    String accountName; 
    static final int REQUEST_ACCOUNT_PICKER = 2; 
    Myendpoint service; 

    void chooseAccount() { 
     startActivityForResult(credential.newChooseAccountIntent(), 
       REQUEST_ACCOUNT_PICKER); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     credential = GoogleAccountCredential 
       .usingAudience(
         this,AUDIENCE); 

     settings = getSharedPreferences("SafeAndroid", 0); 
     setAccountName(settings.getString(PREF_ACCOUNT_NAME, null)); 

     Myendpoint.Builder builder = new Myendpoint.Builder(
       AndroidHttp.newCompatibleTransport(), new GsonFactory(), 
       credential); 
     service = builder.build(); 

     if (credential.getSelectedAccountName() != null) { 
      Toast.makeText(getApplicationContext(), 
        "logged as: " + credential.getSelectedAccountName(), 5000) 
        .show(); 
      sendRequest(); 
     } else { 
      chooseAccount(); 
     } 

    } 

    private class QueryScoresTask extends AsyncTask<Void, Void, Void> { 
     Context context; 

     public QueryScoresTask(Context context) { 
      this.context = context; 
     } 

     protected Void doInBackground(Void... unused) { 
      Log.v("AAAAA", "2"); 
      try { 
       MyEntity e = service.myentity().get().execute(); 
       Log.v("AAAAA", e.toString() + ""); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

    private void setAccountName(String accountName) { 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString(PREF_ACCOUNT_NAME, accountName); 
     editor.commit(); 
     credential.setSelectedAccountName(accountName); 
     this.accountName = accountName; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
     case REQUEST_ACCOUNT_PICKER: 
      if (data != null && data.getExtras() != null) { 
       String accountName = data.getExtras().getString(
         AccountManager.KEY_ACCOUNT_NAME); 
       if (accountName != null) { 
        setAccountName(accountName); 
        SharedPreferences.Editor editor = settings.edit(); 
        editor.putString(PREF_ACCOUNT_NAME, accountName); 
        editor.commit(); 
        Toast.makeText(
          getApplicationContext(), 
          "logged as: " + credential.getSelectedAccountName(), 
          5000).show(); 
        sendRequest(); 
       } 
      } 
      break; 
     } 
    } 

    private void sendRequest() { 
     QueryScoresTask a = new QueryScoresTask(this); 
     a.execute(); 
    } 

} 

A mój kod końcowy:

@Api(name = "myendpoint", version = "v1",description = "This retrieves an instance of MyEntity.", clientIds = { 
      "660102392535.apps.googleusercontent.com", "660102392535-dobseln3gde8e6lqnd2v80l3oh6mm1nh.apps.googleusercontent.com" }, audiences = { "660102392535.apps.googleusercontent.com" }) 
public class MyEndpoint { 

    @ApiMethod(httpMethod = "GET", name = "myentity.get", path = "myentity/get") 
    public MyEntity getEntity(User user) { 
     MyBusinessClass myBusinessClass = new MyBusinessClass(); 
     MyEntity myEntity = myBusinessClass.getMyEntity(); 

     DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
     Entity device = new Entity("gcmid", "keyname"); 
     device.setProperty("account", user.getEmail()); 
     device.setProperty("device", "idtelefonu1"); 
     datastore.put(device); 

     return myEntity; 
    } 
} 

Czytałem, że niektórzy mieli ten problem, ale nie nie pisz, jak go rozwiązać. Stworzyłem nowy debug.key i otrzymałem nowy sha1, ale nie działa. Próbowałem również utworzyć nowy projekt Androida z nowym pakietem - nie działa.

+0

hellow @ user1262348 Mam ten sam problem, co błąd w punktach końcowych w systemie Android: GoogleAuthIOException, jeśli znajdziesz jakieś rozwiązanie, pomóż mi. –

Odpowiedz

0

Wystąpił ten sam błąd z przykładem Tic Tac Toe.

Dla mnie okazało się, że czytam instrukcje niesłusznie.

W kodzie Androida, spróbuj wymienić Android klawisz klient:

"660102392535.apps.googleusercontent.com"

swoim kluczem Client Web:

"660102392535-dobseln3gde8e6lqnd2v80l3oh6mm1nh.apps.googleusercontent.com".

Wiem, że to nie ma sensu, ale zadziałało.

Steve

+0

Wypróbowałem już ... to nie działało ... – user1262348

+0

OK, następny krok .... Kiedy tworzysz swój klucz klienta w konsoli API, upewnij się, że nazwa pakietu odpowiada wartości z AndroidManifest.xml. NA PRZYKŁAD. package = "com.google.devrel.samples.ttt". – samneric

+0

Następnie za pomocą swojego klienta sieciowego upewnij się, że adres URL pasuje do tego, co aplikacja na Androida próbuje połączyć z E.G. "https: // .appspot.com" – samneric

3

Czy używasz narzędzia ADT w systemie Windows? Jeśli tak, to odciski palców sha1 do debugowania magazynu kluczy można uzyskać w Windows-> Preferencje-> Android-> Build dla trybu debugowania.

0

W „AppConstants.java” (nazwa od tutoriali) Zmieniłem WEB_CLIENT_ID do tego samego ID Web Client jak w GAE poświadczeń ekranie. Zgodnie z samouczkiem powinien to być identyfikator klienta Android, stąd problemy.

0

Moim problemem było to, że stworzony poświadczeń z SHA1 z mojego zwolnienia kluczy. Wydaje mi się, że zdałeś sobie sprawę, że musisz użyć debugowanego pliku kluczy, ale może możesz spróbować pobrać wersję Release, wyeksportować podpisany plik APK, skopiować go do telefonu i zainstalować go z tego miejsca. Pracowałem w moim przypadku.

Powiązane problemy