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

问题描述 投票:1回答:1

我对在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的其他信息似乎暗示身份验证比示例代码复杂得多。

android google-oauth2 api-key developer-console
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.