当前位置: 首页 > 知识库问答 >
问题:

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

郑高驰
2023-03-14

我正在尝试使用 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

我的清单的相关部分:

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

有什么想法吗?

编辑/澄清:推送/GCM接收生产中的作品。我正在寻找一种更简单的方法来测试更改。

共有3个答案

澹台志诚
2023-03-14

我建议使用命令行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\"]  }"
申昌勋
2023-03-14

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

为此,请通过清单合并占位符设置该属性:

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

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

(注意:以前我使用debug

锺离嘉茂
2023-03-14

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

<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>
 类似资料:
  • 问题内容: 我最近打算测试从python作为命令行参数运行phantomJS,我还不了解它,但是看到了例子。因为PhantomJS是从命令行运行的,所以这似乎是可行的。PhantomJS吐出的结果将直接进入变量。 在我走这条路之前,在node.js中进行这项工作实际上对我来说更有用,这让我开始思考,当程序从命令行运行并存储数据结果时,我是否可以使用node来运行PhantomJS PhantomJ

  • 问题内容: 我在新安装的服务器中遇到了奇怪的情况,这次Google似乎帮不了我。我无法从我的PHP代码连接到(远程)mysql。当我尝试从同一服务器上的命令行连接时,连接成功。 无法连接:无法连接到“ MYSQL.SERVER”上的MySQL服务器(13) 这是代码和来自命令行的连接尝试 我尝试同时在mod_php模式和FastCGI中运行php脚本,检查phpinfo()以及mysql,mysq

  • 假设我有一个叫“阿帕奇”的角色 现在我想从 Ansible 主机的命令行在主机 192.168.0.10 上执行该角色 有办法做到这一点吗?

  • 好吧,我遇到了一个错误,我不太清楚为什么,希望您能提供帮助。当我尝试运行它时,会遇到以下问题。 线程“main”java中出现异常。util。java中的NoSuchElementException。util。扫描仪。java上的throwFor(Scanner.java:907)。util。扫描仪。下一步(Scanner.java:1530)在java。util。扫描仪。nextInt(Scan

  • 问题内容: 在Mac上如何从命令行连接到MySQL?(即给我看代码) 我正在做一个PHP / SQL教程,但首先假设您已经在MySQL中。 问题答案: 看到这里http://dev.mysql.com/doc/refman/5.0/en/connecting.html 上面的选项表示: 查看链接,那里有详细的链接! 如Rick所述,您可以通过不这样传递密码来避免将密码作为命令的一部分传递: 编辑此

  • valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?