如何在此示例代码中指定API密钥?

时间:2018-09-18 14:43:05

标签: android google-oauth2 api-key developer-console

我对在Android上使用Google API密钥完全陌生,而我发现这个example是因为我对制作一个非常简单的Google Tasks通知应用程序感兴趣。但是,尽管已解决所有Gradle构建问题,但我仍无法使该应用程序正常工作。

当我在Android 8.0.0上运行它时,选择一个Google帐户后,就会得到UNREGISTERED_ON_API_CONSOLE。通过搜索,我知道这意味着必须对APK进行签名并且必须获得OAuth 2.0客户端ID。我已经(或多或少)this advice之后进行了所有操作。

我遇到的麻烦是https://github.com/google/google-api-java-client-samples/tree/master/tasks-android-sample上的(已有5年历史)示例代码了-我看不到在控制台上指定客户端ID的位置。 documentation提及了API密钥(尽管出于配额限制,并不是出于安全考虑),但未在使用的地方

  

还必须从Google API Console指定API密钥。否则,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错误?

编辑:this page上的其他信息似乎意味着认证比示例代码复杂得多。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个单行修复程序,但是在上面引用的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控制台使用什么,它看起来像这样(在set it up之后):

enter image description here