2013-05-13 5 views
7

У меня проблема с моим проектом, где я хочу подключить Google Cloud Endpoints с Android. Я все еще получаю ту же ошибку:Ошибка с конечными точками в 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` 

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

} 

И моя конечная точка код:

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

Я читал, что некоторые люди имели эту проблему, но сделал не пишите, как его решить. Я создал новый debug.key и получил новый sha1, но не работал. Также пытался создать новый проект Android с новым пакетом - не работал.

+0

hellow @ user1262348 У меня такая же проблема, как вы обнаружили Ошибка с конечными точками в Android: GoogleAuthIOException, если вы найдете какое-либо решение, пожалуйста, помогите мне. –

ответ

0

Я столкнулся с той же ошибкой с примером Tic Tac Toe.

Для меня оказалось, что я неправильно прочитал инструкцию.

В вашем Android код, попробуйте заменить ключ Android Client:

"660102392535.apps.googleusercontent.com"

с вашим ключом Web Client:

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

Я знаю, что это не имеет смысла, но это сработало для меня.

Steve

+0

Пробовал это уже ... это не сработало ... – user1262348

+0

OK, следующий шаг ... Когда вы создаете свой клиентский ключ в API-консоли, убедитесь, что имя пакета соответствует значению из AndroidManifest.xml. НАПРИМЕР. пакет = "com.google.devrel.samples.ttt". – samneric

+0

Затем с помощью ключа веб-клиента убедитесь, что URL-адрес совпадает с тем, что приложение Android пытается подключиться к E.G. "https: // .appspot.com" – samneric

3

Вы используете ADT на окнах? Если да, то sha1 отпечаток пальца для отладочного хранилища ключей можно получить в Windows-> Preferences-> Android-> Build для режима отладки.

0

В «AppConstants.java» (название из учебников) Я изменил идентификатор WEB_CLIENT_ID на тот же идентификатор веб-клиента, что и на экране учетных данных GAE. Согласно учебнику, это должен быть идентификатор клиента Android, следовательно, проблемы.

0

Моя проблема заключалась в том, что я создал учетные данные с помощью SHA1 из моего хранилища ключей. Я думаю, вы поняли, что вам нужно использовать хранилище отладки, но, возможно, вы можете попытаться взять версию релиза, экспортировать подписанный apk, скопировать его на свой телефон и установить там. Работал в моем случае.