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

Nil*_*zor 24 android

我正在尝试使用adb和命令行模拟设备是否正在接收GCM推送消息.我试过这个命令来播放GCM意图:

adb shell am broadcast -c com.myapp -a com.google.android.c2dm.intent.RECEIVE -e data "SomeData"
Run Code Online (Sandbox Code Playgroud)

这会触发"权限拒绝"日志行:

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
Run Code Online (Sandbox Code Playgroud)

我的清单的相关部分:

<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>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

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

guy*_*.gc 20

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

<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>
Run Code Online (Sandbox Code Playgroud)

  • 作品!我误解了这个许可.在那里有那个参数,声明我们只希望来自具有SEND权限的活动的消息 - 命令行工具没有.不确定我是否希望在生产中使用它,但也许我可以仅为Debug版本定制清单 (4认同)

Jer*_*101 10

优于临时编辑AndroidManifest.xml以删除权限检查,并记住以后还原它,您可以自动禁用调试版本中的权限检查.

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

<receiver
  android:name="com.google.android.gcm.GCMBroadcastReceiver"
  android:permission="${gcmPermissionRequired}">
Run Code Online (Sandbox Code Playgroud)

然后将占位符设置为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"]
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:以前我使用过调试和释放字符串资源.如果它使用字符串资源定义了一个意图过滤器权限,Play商店会拒绝该应用.)


mle*_*cki 6

我建议使用命令行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\"]  }"
Run Code Online (Sandbox Code Playgroud)