什么是被授权实体?在自己的应用中找不到gcm_defaultSenderId

我正在尝试使用 Google Cloud Messaging 运行我的应用。我正在关注Google Cloud Messaging Quickstart App,该应用程序可以在github上找到。

在他们的快速入门应用中,我们会在某个时候向 Google Cloud 消息服务请求注册令牌,以便此应用实例可以与云通信。

我发现这行代码:

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

我应该如何让我的应用产生这个价值?

我在这里查找实例ID.getToken的文档 getToken(java.lang.String, java.lang.String)

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

函数头如下所示:

public String getToken (String authorizedEntity, String scope)

我看到想要的第一个参数是。那么,这个授权实体字符串应该是什么?
它清楚地标识了发出请求的应用程序的实例,但是我应该如何生成它?在快速入门应用中,我找不到在 中定义的它,我只能找到它在 R.java 和getTokenString authorizedEntityres/value/strings.xmlapp/build/generated/res/google-services/debug/values/values.xml

它看起来像这样:

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

该文件中只有一个字符串,并且该文件深埋在项目结构中。我在代码中找不到以编程方式生成此内容的任何地方。gcm_defaultSenderId

我很困惑,因为,我怎么知道那根绳子在那里?我从未定义过该字符串,并且谷歌搜索“无法解析”没有给出任何结果。我正在尝试在我自己的应用程序中实现Google Cloud Messaging,因此当然我自己的应用程序不会自动知道生成该字符串。我应该如何制作那个ID号?gcm_DefaultSenderId

这就是为什么我认为了解Adicleid.getToken想要的这个授权实体字符串很重要的原因,这样我就可以正确地生成一个要提供给getToken的字符串。也许我的想法是完全错误的,也许我不应该生成gcm_defaultSenderId,但我知道我不应该改变R.java,并且文件也在“生成”文件夹下。values.xml

请帮忙吗?如果我在搜索中找到答案,我会很乐意发布答案。任何帮助非常感谢,注意:我的项目是从Eclipse导出到Gradle的,所以它仍然具有Eclipse项目/文件夹结构,这应该不会造成任何问题,但文件在不同的地方。values.xml


答案 1

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

该插件应用于 Gradle:

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

有关更多信息,请查看在Android上实施GCM客户端,并了解如何在开发人员控制台中获取文件并设置Gradle和app。google-services.json


答案 2

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

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

生成令牌需要由 Google 开发者控制台生成的项目 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);

推荐