我对在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上的其他信息似乎意味着认证比示例代码复杂得多。
答案 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之后):