Невозможно подключиться к моим конечным точкам 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();