我正在尝试使用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)
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商店会拒绝该应用.)
我建议使用命令行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)
| 归档时间: |
|
| 查看次数: |
10780 次 |
| 最近记录: |