是否可以从adb shell / am命令行模拟GCM接收? 我收到了一个错误

我正在尝试使用adb和命令行模拟设备是否正在接收GCM推送消息。 我试过这个命令来播放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 

我的清单的相关部分:

           

有任何想法吗?

编辑/说明:推送/ GCM接收在生产中工作。 我正在寻找一种更简单的方法来测试变化。

  • Android AppEngine端点validation和InApp计费
  • 在应用程序类上使用registerReceiver是一个很好的,已知的做法吗?
  • 无法在Viewpager中获取当前视图
  • 将自定义属性添加到标记(Google Map Android API V2)
  • 如何将ArrayList <HashMap >从一个活动传递到另一个活动
  • java.lang.NoClassDefFoundError:com.google.android.gms.internal.zzmp
  • 如何创建循环viewpager?
  • 为什么Android Studio不允许我创建Java类?
  • 您需要删除接收者定义中的权限属性,如下所示:

               

    比暂时编辑AndroidManifest.xml以删除权限检查更好,并记住以后恢复它,您可以自动禁用调试版本中的权限检查。

    为此,请通过Manifest Merger占位符设置属性:

      

    然后在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"] } } 

    (注意:以前我使用过调试和发布字符串资源。如果它使用字符串资源定义了一个意图filter权限,则Play商店拒绝该应用程序。)

    我建议使用命令行curl,因为发送GCM推送就像调用一些REST API一样简单。 请参阅下面的示例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\"] }" 
    1. 首先安装adb。

    sudo apt-get install adb

    1. 从manifest.xml中删除SEND权限。

    android:permission =“com.google.android.c2dm.permission.SEND”>

    1. 从shell推送通知的命令

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

    1. 根据需要更改包名称(com.myapp)和“SomeData”。