是否可以从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接收在生产中工作。 我正在寻找一种更简单的方法来测试变化。

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

您需要删除接收者定义中的权限属性,如下所示:

           

比暂时编辑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”。