Невозможно подключиться к моим конечным точкам Google с помощью моего сервисного объекта

Я сгенерировал свою клиентскую библиотеку из моих конечных точек, а также передал соответствующие учетные данные (идентификатор клиента на 100% правильный) для моего аутентифицированного вызова конечным точкам.

Но я все еще получаю эту ошибку, когда я запускаю свои коды:

com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
            at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:286)
            at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
            at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:165)
            at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:141)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: com.google.android.gms.auth.GoogleAuthException: Unknown
            at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
            at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
            at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255)
            at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279)
            at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
            at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:165)
            at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:141)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

Это мой код ниже:

 private class ContentApi extends AsyncTask<Void,Void,String>{

       @Override
       protected String doInBackground(Void... params) {
           String response = null;


           try {
               settings = getActivity().getSharedPreferences("MApi", Context.MODE_PRIVATE);
               credential = GoogleAccountCredential.usingAudience(getActivity(), CLIENT_ID);
               setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

               Core.Builder builder = new Core.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), credential);
               builder.setApplicationName(getActivity().getPackageName());

               service = builder.build();



               if (credential.getSelectedAccountName() != null) {
                   // Already signed in, begin app!

                response = service.info().execute().getLang();
               }//end if
               else {
                   chooseAccount();
               }

               }//end try
               catch(IOException ex){
                   Log.d("MkiniCore", ex.getMessage(), ex);
               }//end catch



           return response;
       }//end doInBackground

       @Override
       protected void onPostExecute(String s) {
          textView.setText(s);
       }
   }

Я только что отредактировал код для ответов ниже, но все еще получаю эти ошибки

Это код для выбора учетной записи:

@Override
    public 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) {
                        setSelectedAccountName(accountName);
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString(PREF_ACCOUNT_NAME, accountName);
                        editor.commit();
                        // User is authorized.
                    }
                }
                break;
        }
    }

это метод setSelectedAccountName

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

1 ответ

Вам нужно установить имя пакета приложения в сборщике перед вызовом .build():

builder.setApplicationName(getActivity().getPackageName());

Кроме того, если это вызов с проверкой подлинности, вам нужно будет запустить пользователя через средство выбора учетной записи, чтобы выбрать учетную запись Google, а также установить это в учетных данных:

String accountName = ...;  //  Pull from where ever you are storing it
credential.setSelectedAccountName(accountName);

Кроме того, из предоставленного кода не очевидно, что CLIENT_ID для аудитории (области), поэтому убедитесь, что она в формате:

static final String CLIENT_ID = "server:client_id:" + YOUR_WEB_APP_CLIENT_ID;

Поскольку вы используете сгенерированную библиотеку конечной точки облака, вам не нужно устанавливать корневой URL или использовать необработанный HTTP-запрос / ответ. Созданная конечной точкой библиотека уже выполняет подготовку HTTP-запроса и анализ JSON-ответа HTTP. Не видя вашего облачного API, я предполагаю, что ваш облачный метод для "category" возвращает что-то, смоделированное как Category который имеет поле участника detail который можно получить с помощью геттера getDetail():

builder.setApplicationName(getActivity().getPackageName());
credential.setSelectedAccountName(accountName);
service = builder.build();
Core.Info.Category endpoint = service.info().category("en");
String category = endpoint.execute().getDetail();
Другие вопросы по тегам