新的谷歌云消息 API

Posted

技术标签:

【中文标题】新的谷歌云消息 API【英文标题】:new Google Cloud Messaging API 【发布时间】:2013-07-16 18:08:15 【问题描述】:

我正在使用 curl 使用 php 发送推送通知,结果似乎返回正常:

"multicast_id":2345735671345346,"success":2,"failure":0,"canonical_ids":0,"results":["message_id":"0:13456457587969%375ed23445237ecd","message_id":"0:12344526107806%375ed3439fd7ecd"]

所以我猜测消息已发送,问题出在BroadcastReceiver 子类上。

我的广播接收器代码:

package com.example.myexample.pushnotifications;

public class GCMBroadcastReceiver extends BroadcastReceiver 
    @Override
    public void onReceive(Context context, Intent intent) 
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
        Log.d(TAG, "onReceive method executed properly");

        //NotificationManager and NotificationCompat.Builder code to build a notification
    

然后我的androidManifest.xml 获得权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" /
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
    android:name="com.example.myexample.pushnotifications.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.myexample.pushnotifications.permission.C2D_MESSAGE" />

对于应用标签内的接收者:

    <receiver
        android:name="com.example.myexample.pushnotifications.GCMBroadcastReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.myexample.pushnotifications" />
        </intent-filter>
    </receiver>

问题是广播接收者永远不会收到消息。

【问题讨论】:

com.example.myexample.pushnotifications 是您的 Android 应用的完整包名吗? com.example.myexample.pushnotifications 是 BroadcastReceiver 子类所在的位置,但活动在 com.example.myexample.activities 中 但是在清单顶部声明的包名是什么?是com.example.myexample吗?如果是,那是你应该在所有与 GCM 相关的清单声明(权限、意图过滤器)中使用的包名称,广播接收器的完整类名除外。 com.example.myexample 是在顶部声明的,我应该在没有“pushnotifications”的情况下继续使用它吗? 是的,我添加了您需要更改的内容的答案。 【参考方案1】:

假设app的包是com.example.myexample,需要做如下改动:

<permission
    android:name="com.example.myexample.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.myexample.permission.C2D_MESSAGE" />

<intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <category android:name="com.example.myexample" />
</intent-filter>

【讨论】:

以上是关于新的谷歌云消息 API的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的谷歌云消息服务如何工作?

用户多台设备上的谷歌云消息通知

GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)

身份验证不适用于使用 NodeJS 进行的谷歌云 API 身份验证

在我们的谷歌云 Pub/Sub 发布者权限之外提供 Gmail-API

谷歌云视觉 API - Python