我正在尝试使用Google Cloud Messaging运行我的应用。我正在关注Google Cloud Messaging快速入门应用程序,该应用程序可在github上找到。
在他们的快速入门应用程序中,我们会向Google Cloud Messaging服务部门索取注册令牌,以便我们的应用程序实例可以与云对话。
我发现这行代码:
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的文档here getToken(java.lang.String, java.lang.String)
InstanceID.getoken
返回一个令牌,该令牌授权实体(例如:云服务)代表由实例ID标识的应用程序执行操作。
这与OAuth2
令牌类似,但它适用于应用程序实例而不是用户。
函数标题如下所示:
public String getToken (String authorizedEntity, String scope)
我发现getToken
想要的第一个arg是String authorizedEntity
。
那么,这个授权的实体字符串应该是什么?
它清楚地标识了发出请求的应用程序的实例,但我应该如何生成它?在快速入门应用中,我无法在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
的任何位置。
我很困惑,因为我怎么知道字符串在那里?我从来没有定义过这个字符串,并且谷歌搜索&#34;无法解析gcm_DefaultSenderId
&#34;没有结果。我正在尝试在自己的应用中实施Google Cloud Messaging,因此我自己的应用程序当然不会自动知道生成该字符串。我该怎么做那个身份证号码?
这就是为什么我认为我理解InstanceID.getToken想要的authorEntity字符串是多么重要,以便我可以正确生成一个给getToken。也许我的想法是完全错误的,也许我不应该生成gcm_defaultSenderId,但我知道我不应该改变R.java,并且values.xml
文件也在&#34;生成&#34;文件夹中。
请帮忙吗?如果我在搜索中找到答案,我会很乐意发布答案。非常感谢任何帮助,请注意:我的项目从 Eclipse 导出到 Gradle ,因此它仍然具有Eclipse项目/文件夹结构,不应该导致任何问题,但values.xml
文件位于不同的位置。
答案 0 :(得分:37)
window.myVar
值由Gradle google-services插件生成,该插件使用带有已定义常量的R.string.gcm_defaultSenderId
文件。
该插件适用于Gradle:
google-services.json
了解更多信息
Implementing GCM Client on Android并了解如何获取apply plugin: 'com.google.gms.google-services'
文件并设置Gradle&amp;开发者控制台中的应用程序。
答案 1 :(得分:13)
我们需要填写该字符串的项目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);