2013-05-13 14 views
7

Ich habe ein Problem mit meinem Projekt, wo ich Google Cloud Endpoints mit Android verbinden möchte. Ich bin immer noch die gleichen Fehler:Fehler mit Endpunkten in 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` 

Meine Android Code:

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

} 

Und mein Endpunkt Code:

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

Ich habe gelesen, dass einige Leute dieses Problem hatte, aber tat nicht schreiben, wie man es löst. Ich habe einen neuen debug.key erstellt und bekomme einen neuen sha1, aber es funktioniert nicht. Auch versucht, neues Android-Projekt mit neuem Paket zu erstellen - nicht gearbeitet.

+0

hellow @ user1262348 Ich habe das gleiche Problem wie Sie finden Fehler mit Endpunkten in Android: GoogleAuthIOException wenn Sie irgendeine Lösung dann bitte helfen Sie mir. –

Antwort

0

Ich lief den gleichen Fehler mit dem Tic Tac Toe Beispiel.

Für mich stellte sich heraus, dass ich die Anweisungen falsch gelesen habe.

In Ihrem Android-Code, versuchen Sie Ihr Android-Client-Schlüssel ersetzt:

"660102392535.apps.googleusercontent.com"

mit Ihrem Web-Client-Schlüssel:

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

Ich weiß, dass das keinen Sinn macht, aber es hat für mich funktioniert.

Steve

+0

Ich habe es bereits versucht ... es hat nicht funktioniert ... – user1262348

+0

OK, nächster Schritt .... Wenn Sie Ihren Clientschlüssel in der API-Konsole erstellen, vergewissern Sie sich, dass der Paketname mit dem Wert von AndroidManifest.xml übereinstimmt. Z.B. package = "com.google.devrel.samples.ttt". – samneric

+0

Stellen Sie dann mit Ihrem Web-Client-Schlüssel sicher, dass die URL mit der URL übereinstimmt, mit der die Android-App versucht, eine Verbindung zu E.G. herzustellen. "https: // .appspot.com" – samneric

3

Verwenden Sie ADT unter Windows? Wenn ja, dann kann sha1 fingerprint für den Debug Keystore in Windows-> Preferences-> Android-> Build für den Debug-Modus abgerufen werden.

0

In "AppConstants.java" (Name aus Tutorials) habe ich die WEB_CLIENT_ID auf die gleiche Web Client ID wie in GAE Credentials-Bildschirm geändert. Laut der Anleitung sollte dies die Android-Client-ID sein, daher die Probleme.

0

Mein Problem war, dass ich die Anmeldeinformationen mit dem SHA1 aus meinem Release Keystore erstellt. Ich denke, du hast erkannt, dass du den Debug-Keystore verwenden musst, aber vielleicht kannst du versuchen, die Release-Version zu nehmen, die signierte Apk zu exportieren, sie auf dein Handy zu kopieren und sie von dort zu installieren. Arbeitete in meinem Fall.