Как указать ключ API в этом примере кода? - PullRequest
0 голосов
/ 18 сентября 2018

Я совершенно новичок в использовании ключей API Google с Android, и я нашел этот пример , потому что мне интересно создать очень простое приложение для уведомлений о задачах Google.Однако, несмотря на исправление всех проблем сборки Gradle, я не могу заставить приложение работать.

Когда я запускаю его на Android 8.0.0, как только я выбираю учетную запись Google, я получаю UNREGISTERED_ON_API_CONSOLE.По результатам поиска я понимаю, что APK должен быть подписан, а идентификатор клиента OAuth 2.0 должен быть получен.Мне удалось сделать все это, следуя (более или менее) этому совету .

Проблема, с которой я столкнулся, связана с (5-летним) примером кода на https://github.com/google/google-api-java-client-samples/tree/master/tasks-android-sample - я не вижу, где указать идентификатор клиента из консоли.В документации упоминается ключ API (хотя и из-за ограничений квот, но не из-за безопасности), но не там, где он используется :

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

Пример фрагмента кода, взятого из tasks-android-sample :

com.google.api.services.tasks.Tasks service;

@Override
public void onCreate(Bundle savedInstanceState) {
  credential =
      GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS));
  SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
  credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
  service =
      new com.google.api.services.tasks.Tasks.Builder(httpTransport, jsonFactory, credential)
          .setApplicationName("Google-TasksAndroidSample/1.0").build();
}

private void chooseAccount() {
  startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch (requestCode) {
    case REQUEST_GOOGLE_PLAY_SERVICES:
      if (resultCode == Activity.RESULT_OK) {
        haveGooglePlayServices();
      } else {
        checkGooglePlayServicesAvailable();
      }
      break;
    case REQUEST_AUTHORIZATION:
      if (resultCode == Activity.RESULT_OK) {
        AsyncLoadTasks.run(this);
      } else {
        chooseAccount();
      }
      break;
    case REQUEST_ACCOUNT_PICKER:
      if (resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) {
        String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME);
        if (accountName != null) {
          credential.setSelectedAccountName(accountName);
          SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
          SharedPreferences.Editor editor = settings.edit();
          editor.putString(PREF_ACCOUNT_NAME, accountName);
          editor.commit();
          AsyncLoadTasks.run(this);
        }
      }
      break;
  }
}

Где разместить информацию о ключах API в подходе, используемом здесь (GoogleAccountCredential.usingOAuth2), чтобы избежать ошибки UNREGISTERED_ON_API_CONSOLE?

Редактировать: Дополнительная информация о этой странице , кажется, подразумевает, что аутентификация намного сложнее, чем пример кода.

1 Ответ

0 голосов
/ 19 сентября 2018

Хорошо, я нашел исправление в одну строку, но это далеко не очевидно в документации Google, которую я цитировал выше.

Внутри файла AsyncLoadTasks.java есть строка для извлеченияЗадачи:

List<Task> tasks =
    client.tasks().list("@default").setFields("items/title").execute().getItems();

Идентификатор клиента OAuth 2.0 можно добавить с помощью метода setKey.

List<Task> tasks =
    client.tasks().list("@default").setFields("items/title")
            .setKey("Client_ID_from_API_Console")             // Added this call
            .execute().getItems();

Чтобы пояснить, что использовать с консоли API, это выглядит следующим образом (после того, как вы настроили ):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...