¿Es posible simular una recepción de GCM desde la línea de comandos adb shell / am? Estoy recibiendo un error

Estoy intentando simular como si el dispositivo está recibiendo un mensaje del empuje de GCM usando adb y la línea de comando. He intentado este comando para transmitir una intención GCM:

adb shell am broadcast -c com.myapp -a com.google.android.c2dm.intent.RECEIVE -e data "SomeData" 

Esto desencadena una línea de registro de "denegación de permiso" sin embargo:

 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 

Partes relevantes de mi manifiesto:

 <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> 

¿Algunas ideas?

Edición / aclaración: Push / GCM reciben obras en producción. Estoy buscando una manera más fácil de probar los cambios.

Debe eliminar la propiedad de permiso en la definición de su receptor como esta:

 <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> 

Mejor que editar temporalmente AndroidManifest.xml para eliminar la comprobación de permisos y recordar restaurarla posteriormente, puede deshabilitar automáticamente la comprobación de permisos en las compilaciones de depuración.

Para ello, establezca el atributo a través de un marcador de posición Manifiester Merger :

 <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="${gcmPermissionRequired}"> 

A continuación, establezca el marcador de posición en 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"] } } 

(Nota: Anteriormente usaba depuración y liberación de recursos de cadena.) La tienda Play rechaza la aplicación si define un permiso de filtro de intenciones usando un recurso de cadena.

Sugiero el uso de la línea de comandos curl, como el envío de GCM empuja es tan fácil como llamar a algunos REST API. Vea la siguiente secuencia de comandos de shell:

 #!/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\"] }" 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.