I’ve been encountering a plethora of issues with this current project, which can be found in the other questions that I have posted on StackOverflow (one of which is unsolved), but after dodging my other issue in a way that allows me to test, but not actually release, the app, I’ve encountered another error;
In this code:
public class AsyncSheetUpdater extends AsyncTask<String, Void, String> {
Master activity;
@Override
protected String doInBackground(String... urls) {
GoogleAccountCredential credential;
Sheets mService;
credential = GoogleAccountCredential.usingOAuth2(activity.getApplicationContext(), Collections.singletonList(SheetsScopes.SPREADSHEETS))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName("oscarcookeabbott@gmail.com");
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
mService = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName(activity.getString(R.string.app_name))
.setSheetsRequestInitializer(new SheetsRequestInitializer("AIzaSyBreJks4awhrSbyqGkZhgR4rAA61vg0t-g"))
.build();
ValueRange values = new ValueRange();
values.set("EMAIL", "[INSERT EMAIL]");
values.set("AUTH", "[INSERT DATE]");
values.set("SUB", "[INSERT DATE + MONTH]");
try {
mService.spreadsheets().values().append("1meAAvjdPmghn6wl_IKc-_NJx_M85I_yqsn4Nwm_j_X0", "Users", values)
.setValueInputOption("RAW")
.execute();
} catch (IOException e) {
Log.e("DEBUG", "SheetUpdate Exception: ", e);
}
return null;
}
}
It is returning this error:
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:301)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:868)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.pybuspr.listeau.AsyncSheetUpdater.doInBackground(AsyncSheetUpdater.java:58)
at com.pybuspr.listeau.AsyncSheetUpdater.doInBackground(AsyncSheetUpdater.java:20)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: com.google.android.gms.auth.GoogleAuthException: UNREGISTERED_ON_API_CONSOLE
at com.google.android.gms.auth.zze$1.zzbt(Unknown Source)
at com.google.android.gms.auth.zze$1.zzbu(Unknown Source)
at com.google.android.gms.auth.zze.zza(Unknown Source)
at com.google.android.gms.auth.zze.zzc(Unknown Source)
at com.google.android.gms.auth.zze.getToken(Unknown Source)
at com.google.android.gms.auth.zze.getToken(Unknown Source)
at com.google.android.gms.auth.zze.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:269)
at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:294)
This is what my Google APIs Credentials look like:
I was really hoping that sheet editing was going to be simple, such as how you can use a straight JSON feed of a Sheet without using the APIs, but it seems I was mistaken.
I’ve been encountering a plethora of issues with this current project, which can be found in the other questions that I have posted on StackOverflow (one of which is unsolved), but after dodging my other issue in a way that allows me to test, but not actually release, the app, I’ve encountered another error;
In this code:
public class AsyncSheetUpdater extends AsyncTask<String, Void, String> {
Master activity;
@Override
protected String doInBackground(String... urls) {
GoogleAccountCredential credential;
Sheets mService;
credential = GoogleAccountCredential.usingOAuth2(activity.getApplicationContext(), Collections.singletonList(SheetsScopes.SPREADSHEETS))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName("oscarcookeabbott@gmail.com");
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
mService = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName(activity.getString(R.string.app_name))
.setSheetsRequestInitializer(new SheetsRequestInitializer("AIzaSyBreJks4awhrSbyqGkZhgR4rAA61vg0t-g"))
.build();
ValueRange values = new ValueRange();
values.set("EMAIL", "[INSERT EMAIL]");
values.set("AUTH", "[INSERT DATE]");
values.set("SUB", "[INSERT DATE + MONTH]");
try {
mService.spreadsheets().values().append("1meAAvjdPmghn6wl_IKc-_NJx_M85I_yqsn4Nwm_j_X0", "Users", values)
.setValueInputOption("RAW")
.execute();
} catch (IOException e) {
Log.e("DEBUG", "SheetUpdate Exception: ", e);
}
return null;
}
}
It is returning this error:
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:301)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:868)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.pybuspr.listeau.AsyncSheetUpdater.doInBackground(AsyncSheetUpdater.java:58)
at com.pybuspr.listeau.AsyncSheetUpdater.doInBackground(AsyncSheetUpdater.java:20)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: com.google.android.gms.auth.GoogleAuthException: UNREGISTERED_ON_API_CONSOLE
at com.google.android.gms.auth.zze$1.zzbt(Unknown Source)
at com.google.android.gms.auth.zze$1.zzbu(Unknown Source)
at com.google.android.gms.auth.zze.zza(Unknown Source)
at com.google.android.gms.auth.zze.zzc(Unknown Source)
at com.google.android.gms.auth.zze.getToken(Unknown Source)
at com.google.android.gms.auth.zze.getToken(Unknown Source)
at com.google.android.gms.auth.zze.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:269)
at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:294)
This is what my Google APIs Credentials look like:
I was really hoping that sheet editing was going to be simple, such as how you can use a straight JSON feed of a Sheet without using the APIs, but it seems I was mistaken.
Im implementing an android app that enables users to stream to a youtube channel straight from the app. I have created an API key and a OAuth 2.0 client ID
But I get a the following exeption: com.google.android.gms.auth.GoogleAuthException: UNREGISTERED_ON_API_CONSOLE
either when I try to ceate an event or when i try to fetch the one a created manually on the youtube channel.
I use the following code for create a youtube object
String accountName = mContext.getString(R.string.google_account_name);
String apiKey = mContext.getString(R.string.google_api_key);
String clientID = mContext.getString(R.string.google_api_client_id);
String clientName = mContext.getString(R.string.google_api_client_name);
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(mContext,
Arrays.asList(YouTubeScopes.YOUTUBE));
credential.setSelectedAccountName(accountName);
// String SCOPE = "audience:server:client_id:" + clientID + ":api_scope:" + YouTubeScopes.YOUTUBE;
// GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(mContext, SCOPE);
// credential.setSelectedAccountName(accountName);
youtube = new YouTube.Builder(transport, jsonFactory, credential)
.setApplicationName(clientName)
.setYouTubeRequestInitializer(new YouTubeRequestInitializer(apiKey))
/*.setGoogleClientRequestInitializer(new YouTubeRequestInitializer(apiKey))*/
.build();
Then to create an event:
LiveBroadcastSnippet broadcastSnippet = new LiveBroadcastSnippet();
broadcastSnippet.setTitle(name);
broadcastSnippet.setScheduledStartTime(new DateTime(futureDate));
LiveBroadcastContentDetails contentDetails = new LiveBroadcastContentDetails();
MonitorStreamInfo monitorStream = new MonitorStreamInfo();
monitorStream.setEnableMonitorStream(false);
contentDetails.setMonitorStream(monitorStream);
// Create LiveBroadcastStatus with privacy status.
LiveBroadcastStatus status = new LiveBroadcastStatus();
status.setPrivacyStatus("unlisted");
LiveBroadcast broadcast = new LiveBroadcast();
broadcast.setKind("youtube#liveBroadcast");
broadcast.setSnippet(broadcastSnippet);
broadcast.setStatus(status);
broadcast.setContentDetails(contentDetails);
// Create the insert request
YouTube.LiveBroadcasts.Insert liveBroadcastInsert = youtube
.liveBroadcasts().insert("snippet,status,contentDetails",
broadcast);
// Request is executed and inserted broadcast is returned
LiveBroadcast returnedBroadcast = liveBroadcastInsert.execute(); //<= This line generates the exception
I obviously did something wrong, but I can’t figure out what. Any help is appreciated. Thanks in advance
мы находимся под Android (Jellybean и выше), и у нас есть приложение, которое должно использовать OAuth2 с Google для аутентификации.
я упростил активность входа в систему, но это выглядит так:
AccountManager mAccountManager;
// [...]
Account account = new Account("myEmail@gmail.com", "com.google");
// same with professional email managed by Google as myEmail@myDomain.com
// real code recovers accounts with mAccountManager.getAccountsByType("com.google")
mAccountManager = AccountManager.get(getBaseContext());
mAccountManager.getAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", null, MyActivity.this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
try {
String token = accountManagerFuture.getResult().getString(AccountManager.KEY_AUTHTOKEN);
// exception occurs here
// [...]
} catch (Exception e) {
Log.e("account", "exception occurs", e);
}
}
}, null);
когда мы называем accountManagerFuture.getResult()
, он запускает это исключение:
android.accounts.AuthenticatorException: UNREGISTERED_ON_API_CONSOLE
at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2024)
at android.accounts.AccountManager.access0(AccountManager.java:144)
at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1867)
at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
at android.os.Binder.execTransact(Binder.java:446)
Я не могу найти ни дока об этом, ни других людей с тем же исключением, и я совсем запутался: вызов AccountManager.getAuthToken
предоставляет только учетную запись (имя и тип), объем и метод обратного вызова, нет параметра, чтобы указать приложение или что-то, что я мог бы настроить в консоли API dev.
Я уверен, что что-то упускаю, но что?
6 ответов
Ну, я, наконец, понял это. Не уверен, что я неправильно прочитал документацию или если есть недостающие ссылки, но в любом случае.
факт в том, что когда вы подписываете APK, а затем спрашиваете Google о токене OAuth2, вы должны зарегистрировать подписанное приложение через консоль разработчика. Это мера безопасности, основанная на имени пакета приложения и отпечатке пальца sha1.
чтобы сделать это, вам надо :
- подпишите свой APK, вручную или через Gradle или что угодно: документация для Android довольно ясно на этом шаге;
- получите отпечаток пальца sha1; как упоминается в это так ответ, это своего рода легко на Android Studio: в панели Gradle выберите
signingReport
задача под вашим корневым проектом и запустите его — отпечаток SHA1 будет отображаться в текстовом выходе; - зарегистрируйте свой APK через консоль Google dev: создайте новые учетные данные / идентификатор клиента OAuth / Android, определенный SHA1 отпечаток пальца вы получили и Ваше имя пакета APK.
и вуаля!
для информации, единственная официальная документация, которую я нашел, объясняющая, почему и как из двух последних шагов здесь:
https://developers.google.com/drive/android/auth
31
автор: Xavier Portebois
для тех, кто все еще борется с этим, вот что сработало для меня:
Если вы зарегистрируете свое приложение в Google Play App Подписание программа, то ваше хранилище ключей не используется де-факто, чтобы подписать приложение, как только оно достигнет play store-вот почему отпечатки пальцев не совпадают.
Google удаляет ваш сертификат и создает новый сертификат подписи, который используется для подписания APK.
в игровой консоли перейдите в релиз Управление — > App signing
Если вы выбрали Google Play App Подписание, вы увидите там 2 сертификата вместе со всеми их отпечатками пальцев. Используйте Сертификат Подписи Приложения отпечаток пальца вместо Загрузить Сертификат это хранилище ключей.
не хватает репутации, чтобы прокомментировать принятый ответ…
Регистрация моего приложения в консоли Google dev не работала для меня. Оказалось,что поскольку я использовал сборку debug gradle, мне пришлось добавить».отладка» к имени пакета в консоли разработчика Google.
Я узнал об этом, отладив код Android AccountManager. Когда я вошел в код, я заметил, что переменная для имени пакета моего приложения имела «.debug » в конце концов. Поэтому вместо использования фактическое имя пакета » com.пакет.имя «в консоли Google dev я изменил его на» com.пакет.имя.debug», который исправил исключение UNREGISTERED_ON_API_CONSOLE для меня.
причина этого в том, что мой отладочный buildType в gradle имел «applicationIdSuffix».отлаживать.'»
для меня решения выше не работают вообще. Я наконец-то сам разбираюсь с этим жуком.
У меня есть несколько папок в моем рабочем пространстве, и каждый из них имеет свои собственные Манифест.в XML file, что означает, что у них разные имена пакетов. В этом случае, когда мы регистрируемся в Google API, мы должны использовать имя пакета в файле построить.Gradle в свойство applicationId.
Тогда вот оно.
спасибо Ксавье Портебуа, ваш ответ действительно помог. Мне пришлось сделать еще два шага.
- убедитесь, что вы включили API для службы, которую вы используете (в моем случае API календаря) в той же консоли Google dev
- Если вы используете подпись приложения Google Play, вы не хотите использовать отпечаток пальца debug SHA из Android Studio. Вместо этого перейдите в консоль публикации приложений — > управление выпуском — > подпись приложения. Используйте отпечаток пальца SHA-1 из подписи приложения сертификат. 2-я строка на этом скриншоте
Спасибо за содержательный ответ!
для меня проблема заключалась в подписи-отпечатке сертификата (SHA-1) приложения отладки, и приложение выпуска не совпадает при обновлении приложения и изменении имени пакета. Я потратил дни, проверяя имя пакета, а затем выяснил, что проблема-это имя пакета.
чтобы получить правильный ключ SHA-1, Следуйте этому S. O post, затем используйте этот ключ для создания нового идентификатора клиента OAuth для вашего приложения.