【问题标题】:What is authorizedEntity? Can't find gcm_defaultSenderId in own app什么是授权实体?在自己的应用程序中找不到 gcm_defaultSenderId
【发布时间】:2015-08-19 14:42:51
【问题描述】:

我正在尝试让我的应用与 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 想要的第一个参数是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 的任何地方。

我很困惑,因为我怎么知道那个字符串在那里?我从来没有定义过那个字符串,谷歌搜索“无法解析gcm_DefaultSenderId”没有结果。我正在尝试在我自己的应用程序中实现 Google Cloud Messaging,所以我自己的应用程序当然不会自动知道生成该字符串。我应该怎么做那个身份证号码?

这就是为什么我认为理解 InstanceID.getToken 想要的这个 authorizedEntity 字符串是很重要的,这样我才能正确地生成一个给 getToken。也许我的想法完全错误,也许我不应该生成gcm_defaultSenderId,但我知道我不应该更改R.java,并且values.xml文件也在“生成”文件夹下。

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

【问题讨论】:

  • 发件人 ID 来自开发者控制台,但如果您按照快速入门进行操作,它会在您复制到项目目录的 google-services.json 文件中为您生成。
  • 您可以删除 R.string id 并通过名称获取值:stackoverflow.com/a/38995785/606351

标签: java android android-studio google-cloud-messaging


【解决方案1】:

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

插件在 Gradle 中应用:

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

更多信息请查看 Implementing GCM Client on Android 并了解如何获取 google-services.json 文件并在开发者控制台中设置 Gradle 和应用程序。

【讨论】:

  • 这是正确的答案。 google-services.json 文件必须位于应用根文件夹中,Gradle 插件才能自动生成 R.string.gcm_defaultSenderId。要获取 google-services.json 文件,请遵循以下官方指南:developers.google.com/cloud-messaging/android/client
  • 我安装了那个插件,但是那个字符串值没有解析
【解决方案2】:

我们需要填写项目 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 :) 但是如果您使用的是最新的 google 服务,请使用@peter 的回答!
  • 我实际上是想使用 InstanceId api 并用它来删除令牌。这就是我需要 authEntity 的原因。彼得的回答是我正在使用的。由于默认使用该服务具有的应用程序分析,并且默认情况下 firebase api 将其打开,它给我带来了一大堆问题。由于这种废话,我的每项服务都有 60-70 mb 的开销
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多