我对在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的其他信息似乎暗示身份验证比示例代码复杂得多。
好的,我找到了一个单行解决方案,但在我上面引用的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之后):