Возможно ли смоделировать прием GCM из командной строки adb shell/am? Я получаю сообщение об ошибке
Я пытаюсь имитировать, как будто устройство получает сообщение push-сообщения GCM с помощью adb и командной строки. Я пробовал эту команду для трансляции намерений GCM:
adb shell am broadcast -c com.myapp -a com.google.android.c2dm.intent.RECEIVE -e data "SomeData"
Это вызывает строку журнала "Отказ от прав", хотя:
09-19 12:23:34.820 725-787/? W/BroadcastQueue﹕ Permission Denial: broadcasting Intent { act=com.google.android.c2dm.intent.RECEIVE cat=[com.myapp] flg=0x10 (has extras) } from null (pid=21244, uid=2000) requires com.google.android.c2dm.permission.SEND due to receiver com.myapp/com.google.android.gcm.GCMBroadcastReceiver
Соответствующие части моего манифеста:
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp" />
</intent-filter>
</receiver>
</application>
Любые идеи?
Редактирование/уточнение: Работа Push/GCM в производстве. Я ищу более простой способ проверить изменения.
Ответы
Ответ 1
Вам необходимо удалить свойство разрешение в определении вашего приемника следующим образом:
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.myapp" />
</intent-filter>
</receiver>
</application>
Ответ 2
Лучше, чем временно отредактировать AndroidManifest.xml, чтобы удалить проверку прав и не забывая позже ее восстановить, вы можете автоматически отключить проверку разрешений в сборках отладки.
Чтобы сделать это, установите атрибут с помощью Manifest Merger placeholder:
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="${gcmPermissionRequired}">
затем установите заполнитель в build.gradle
:
buildTypes {
debug {
...
manifestPlaceholders = [gcmPermissionRequired: ""] // "" => let the GCM BroadcastReceiver accept Intents from 'adb shell am broadcast'
}
release {
...
manifestPlaceholders = [gcmPermissionRequired: "com.google.android.c2dm.permission.SEND"]
}
}
(Примечание. Раньше я использовал ресурсы отладки и выпуска строки. Оказывается, Play-магазин отклоняет приложение, если он определяет разрешение фильтра намерения с использованием ресурса строки.)
Ответ 3
Я предлагаю использовать завиток командной строки, так как отправка меток GCM так же просто, как вызов некоторого REST API. См. Пример оболочки оболочки script ниже:
#!/bin/bash
REGISTRATION_ID=YOUR_GCM_REGISTRATION_ID
SERVER_KEY=YOUR_SERVER_KEY_FROM_GOOGLE_API_CONSOLE
curl --header "Authorization: key=$SERVER_KEY" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{ \"data\" : {\"foo\": \"bar\"}, \"registration_ids\":[\"$REGISTRATION_ID\"] }"