Возможно ли смоделировать прием 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\"]  }"