如何在这个示例代码中指定 API 键?

How to specify API Key in this sample code?

我完全不熟悉使用 Google API 键和 Android,我发现了这个 example 因为我有兴趣做一个非常简单的 Google 任务通知应用程序。然而,尽管已经解决了所有 Gradle 构建问题,我还是无法让应用程序运行。

当我在 Android 8.0.0 上 运行 时,只要我选择一个 Google 帐户,我就会得到 UNREGISTERED_ON_API_CONSOLE。通过搜索,我了解到这意味着必须对 APK 进行签名并且必须获取 OAuth 2.0 客户端 ID。我已经设法完成了以下所有操作(或多或少).

我遇到的问题是 https://github.com/google/google-api-java-client-samples/tree/master/tasks-android-sample -- I can't see where to specify the Client ID from the Console. The documentation 的(5 年前的)示例代码提到了 API 密钥(虽然是为了配额限制,不是因为安全),但是 不在使用的地方:

You must also specify the API key from the Google API Console. Otherwise, the token that the AccountManager gives you only provides you with anonymous quota, which is usually very low. By contrast, by specifying an API key you receive a higher free quota, and can optionally set up billing for usage above that.

Example code snippet taken from 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;
  }
}

在此处使用的方法 (GoogleAccountCredential.usingOAuth2) 中,我应该将 API 关键信息放在哪里以避免 UNREGISTERED_ON_API_CONSOLE 错误?

编辑:关于 this page 的附加信息似乎暗示身份验证比示例代码复杂得多。

好的,我找到了一个单行修复程序,但它在我上面引用的 Google 文档中并不明显。

在文件 AsyncLoadTasks.java 中有一行用于获取任务:

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

可以使用 setKey 方法添加 OAuth 2.0 客户端 ID。

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

为了阐明要从 API 控制台使用什么,它看起来像这样(在您 之后):