Что такое authorizedEntity? Не удается найти gcm_defaultSenderId в собственном приложении.
Я пытаюсь запустить приложение с облачными сообщениями Google. Я следую за быстрым приложением Google Cloud Messaging Quickstart, которое можно найти здесь на 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
возвращает токен, который разрешает Entity (например: облачный сервис) выполнять действие от имени приложения, идентифицированного идентификатором экземпляра.
Это похоже на токен OAuth2
, за исключением того, что он применяется к экземпляру приложения вместо пользователя.
Заголовок функции выглядит так:
public String getToken (String authorizedEntity, String scope)
Я вижу, что первый аргумент, что getToken
хочет, равен String 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
генерируется программно.
Я запутался, потому что, как я должен был знать, что строка была там? Я никогда не определял эту строку, а googling для "не может разрешить gcm_defaultSenderId
" не дает никаких результатов. Я пытаюсь реализовать Google Cloud Messaging в своем собственном приложении, поэтому, конечно, мое собственное приложение не будет автоматически знать, чтобы сгенерировать эту строку. Как я должен сделать этот идентификационный номер?
Вот почему я считаю важным, что я понимаю, что эта строка authorizedEntity, что InstanceID.getToken хочет, так что я могу правильно генерировать один, чтобы дать getToken. Возможно, моя идея совершенно неверна, возможно, я не должен генерировать gcm_defaultSenderId, но я знаю, что я не должен изменять R.java, а файл values.xml
также находится в "сгенерированной" папке.
Помогите пожалуйста? Если я найду ответ в своих поисках, я с радостью отправлю ответ. Любая помощь очень ценится, обратите внимание: мой проект был экспортирован в Gradle из Eclipse, поэтому он все равно будет иметь структуру проекта/папки Eclipse, которая не должна вызывать каких-либо проблемы, но файл values.xml
находится в другом месте.
Ответы
Ответ 1
Значение R.string.gcm_defaultSenderId
генерируется плагином google-services Gradle, который использует файл google-services.json
с определенными константами.
Плагин применяется в Gradle:
apply plugin: 'com.google.gms.google-services'
Подробнее
Внедрение GCM Client на Android и посмотреть, как получить файл google-services.json
и настроить Gradle и приложение в консоли разработчика.
Ответ 2
Это идентификатор проекта, который нам нужно заполнить вместо этой строки.
Пожалуйста, обратитесь к следующей ссылке.
https://developers.google.com/instance-id/guides/android-implementation
Для создания токенов требуется идентификатор проекта, созданный Google Developers Console.
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);