GCM通知仅到达某些设备

时间:2015-07-03 22:38:32

标签: android notifications push-notification google-cloud-messaging

我在商店里有一个Android应用程序,它使用GCM推送通知。问题是通知只能到达我发送给它的一些设备。特别是我注意到他们到了平板电脑而不是电话,但我只试过两个平板电脑和两个电话,所以这可能有意义也可能没有意义。这两款平板电脑都配备了Android 5.0或5.1,以及其中一款手机。另一部手机有4.4。

设备成功注册到通知并将其ID发送到我的服务器。从服务器发送通知时我没有收到任何错误,但它们从未到达。我试过wifi和3G连接,都没有运气。

我发现代码在网络的某个地方执行此操作,但无法真正记住在哪里。问题是我不完全理解它是如何工作的,但当时它似乎已经足够好了,因为我在其中一个接收通知的设备上进行了测试。我会发布所有相关代码,也许有人可以告诉我是否有问题。

这是我的清单(删除不相关的部分)

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <permission
        android:name="edu.galileo.estudiantes.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="edu.galileo.estudiantes.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/appicon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        ...

        <receiver
            android:name=".util.EstudiantesGcmReceiver"
            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="my.package.name.gcm" /> <!-- I do have my actual package name here-->
            </intent-filter>
        </receiver>

        <service android:name=".util.EstudiantesGcmListenerService" />

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        ...
    </application>

</manifest>

这是接收器

public class EstudiantesGcmReceiver extends WakefulBroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        // Explicitly specify that GcmMessageHandler will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                EstudiantesGcmListenerService.class.getName());

        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

这是IntentService

public class EstudiantesGcmListenerService extends IntentService
{
    public EstudiantesGcmListenerService() {
        super("EstudiantesGcmListenerService");
    }

    @Override
    public void onCreate() {

        super.onCreate();
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();        

        if (extras != null && extras.containsKey("msg"))
        {
            String message = extras.getString("msg");
            new Handler().post(() -> showNotification("Bla bla", message));

        }
        EstudiantesGcmReceiver.completeWakefulIntent(intent);

    }

    void showNotification(String title, String desc)
    {
        NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        long id = getLastNotificationId(this) + 1;
        NotificationCompat.Builder b = new NotificationCompat.Builder(this)
                                           .setContentTitle(title)
                                           .setContentText(desc)
                                           .setSmallIcon(R.drawable.small_icon)
                                           .setTicker(desc)
                                           .setAutoCancel(true).setVibrate(new long[]{300, 300, 300, 300});

        Intent i = new Intent(this, LoginActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(this, 0, i, 0);

        b.setContentIntent(intent);
        manager.notify((int) id, b.build());
        storeLastNotificationId(id, this);
    }


}

3 个答案:

答案 0 :(得分:0)

1.Google建议使用 GCMReceiver 而不是 WakefulBroadcastReceiver

2.您必须使用 GcmListenerService

扩展您的服务

3.此外,我们必须使用 InstanceId ,因为不推荐使用gcm.register()。(它仍会生成gcm密钥)。

https://developers.google.com/cloud-messaging/android/client

他们的使用示例代码“https://github.com/google/gcm

一周前我遇到了类似问题,尤其是Micromax和Infocus手机。现在,通知工作正常。

答案 1 :(得分:0)

如问题中所述,GCM适用于安装了Android 5.0+的设备,而不适用于4.4.x版本。

除了@ m0rpheus5建议的更改外,请检查您是否在4.4.x版本的设备上安装了最新版本的Google Play服务。大多数时候将它更新到最新版本的工作!!

希望有所帮助!

答案 2 :(得分:0)

我已根据Google提供的新示例开始使用 GcmListenerService ,然后我开始面临奇怪的问题。

我可以在少数设备上接收GCM,但我无法在QMobile上接收GCM,这是一个使用Android 4.4.2的本地品牌,但我的旧应用程序 WakefulBroadcastReceiver 实现在同一台设备上正常运行

有什么建议吗?