什么是authorizedEntity?在自己的应用中找不到gcm_defaultSenderId。

29

我正在尝试使用Google云消息传递使我的应用程序运行。 我正在遵循Google云消息传递快速入门应用程序,该应用程序可以在github上找到。

在他们的快速入门应用程序中,我们会向Google云消息传递服务请求注册令牌,以便此应用程序实例可以与云进行通信。

我发现这行代码:

RegistrationIntentService.java::onHandleIntent(Intent intent): 

InstanceID instanceID = InstanceID.getInstance(this);
String gcmRegistrationToken = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

让我困惑的部分是这个值:R.string.gcm_defaultSenderId。它在他们的快速入门应用中定义,但是它是自动生成的。

我该如何让我的应用程序生成该值?

我查看了此处的 InstanceID.getToken 文档。getToken(java.lang.String, java.lang.String)

InstanceID.getoken 返回一个令牌,用于授权实体(例如:云服务)代表由 Instance ID 标识的应用程序执行操作。这类似于 OAuth2 令牌,但其适用于应用程序实例而不是用户。

函数头看起来像:

public String getToken (String authorizedEntity, String scope)

我看到 getToken 的第一个参数是 String authorizedEntity。 那么,这个 authorizedEntity 字符串应该是什么?它清楚地标识了发出请求的应用程序实例,但我应该如何生成它?在 quickstart 应用程序中,我找不到它在 res/value/strings.xml 中的定义,我只能在 R.java 和 app/build/generated/res/google-services/debug/values/values.xml 中找到它的定义。

它看起来像:

<resources>
<string name="gcm_defaultSenderId">175643285</string>
</resources>

这个文件里只有一个字符串,并且该文件深埋在项目结构中。我在代码中找不到任何地方通过程序生成 gcm_defaultSenderId

我很困惑,因为我怎么知道那个字符串在那里呢?我从来没有定义过那个字符串,并且搜索“cannot resolve gcm_DefaultSenderId”也没有结果。我正在尝试在自己的应用程序中实现Google云消息传递,所以当然我的应用程序不会自动知道要生成那个字符串。我应该如何生成那个id号码呢?

这就是为什么我认为重要的是要理解InstanceID.getToken需要什么authorizedEntity字符串,这样我才能正确生成一个字符串并将其提供给getToken。也许我的想法完全错误,也许我不应该生成gcm_defaultSenderId,但我知道我不应该修改R.java,而values.xml文件也位于“generated”文件夹下。

请帮帮我好吗?如果我在搜索中找到答案,我将很乐意发布答案。非常感谢任何帮助,请注意:我的项目是从Eclipse导出到Gradle的,因此它仍然具有Eclipse项目/文件夹结构,但values.xml文件位于不同的位置。


1
发送者ID来自开发者控制台,但如果您按照快速入门指南操作,则会在google-services.json文件中为您生成该ID,并将其复制到您的项目目录中。 - Koh
您可以放弃R.string id并通过名称获取值:https://dev59.com/XF0a5IYBdhLWcg3wHlik#38995785 - Vaiden
2个回答

36

R.string.gcm_defaultSenderId 的值是由 Gradle google-services 插件生成的,该插件使用具有定义常量的 google-services.json 文件。

该插件在 Gradle 中应用:

apply plugin: 'com.google.gms.google-services'

欲了解更多信息,请查看在Android上实现GCM客户端,了解如何获取google-services.json文件以及如何在开发者控制台中设置Gradle和应用程序。


2
这是正确的答案。google-services.json文件必须位于应用程序根目录中,以便Gradle插件可以自动生成R.string.gcm_defaultSenderId。要获取google-services.json文件,请按照此官方指南操作:https://developers.google.com/cloud-messaging/android/client - Sotti
我已经安装了那个插件,但是那个字符串值无法解析。 - Captain Prinny

14

我们需要填写项目 ID 来代替该字符串。 请参考以下链接。

https://developers.google.com/instance-id/guides/android-implementation

生成令牌需要由 Google Developers Console 生成的项目 ID。

String authorizedEntity = PROJECT_ID; // Project id from Google Developers Console
String scope = “GCM”; // e.g. communicating using GCM, but you can use any
                      // URL-safe characters up to a maximum of 1000, or
                      // you can also leave it blank.
String token = InstanceID.getInstance().getToken(authorizedEntity,scope);

您真是帮了我大忙啊,省去了我大量的搜索时间,非常感谢! - Kushan
很高兴认识你,Kushan :) 但是如果你正在使用最新的Google服务,请使用@peter的答案! - Ramesh
我其实想使用InstanceId API并将其用于删除令牌,这就是为什么我需要authEntity。Peter的答案就是我正在使用的。由于默认使用应用程序分析服务,该服务的默认Firebase API会抛出大量问题。我的每个服务都因此无谓的开销而增加了60-70 MB。 - Kushan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接