it-swarm.com.ru

Проблема при получении Push-уведомления на клиенте GCM

Я пытаюсь реализовать Push-уведомление с помощью GCM в моем приложении Android. Я создал сервер для успешной отправки сообщений на устройства, а также создал API для успешного хранения токена устройства на сервере. Создан клиент в приложении, указанном в ссылке на основе примера проекта . А также создал функцию в php для отправки уведомлений в приложение. Когда я запускаю эту функцию на сервере, я получаю ответ как успешный. Это означает, что сообщение отправляется с gcm на мобильный телефон. Но уведомление не показывается, вместо этого я получаю следующее в журнале cat.

06-05 14:58:59.172  23693-28001/com.greenboards.base I/dalvikvm﹕ Could not find method Android.app.Notification$Builder.setColor, referenced from method com.google.Android.gms.gcm.zza.zzv
06-05 14:58:59.172  23693-28001/com.greenboards.base W/dalvikvm﹕ VFY: unable to resolve virtual method 184: Landroid/app/Notification$Builder;.setColor (I)Landroid/app/Notification$Builder;
06-05 14:58:59.173  23693-28001/com.greenboards.base D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0068
06-05 14:58:59.175  23693-28001/com.greenboards.base W/GcmNotification﹕ Failed to show notification: Missing icon

Для захвата сообщения я использую тот же сервис слушателя, который обозначен в примере приложения (я добавил ниже для справки). Вот и я подумал, проблема в диспетчере уведомлений. Поэтому я закомментировал это и запустил приложение. Но снова я получаю тот же ответ без какого-либо уведомления. Я не знаю в чем проблема.

package com.greenboards.base;

import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.media.RingtoneManager;
import Android.net.Uri;
import Android.os.Bundle;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;
import com.greenboards.base.R;

import com.google.Android.gms.gcm.GcmListenerService;
import com.greenboards.base.SplashScreen;

public class MyGcmListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";

    /**
     * Called when message is received.
     *
     * @param from SenderID of the sender.
     * @param data Data bundle containing message data as key/value pairs.
     *             For Set of keys use data.keySet().
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("message");
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + message);

        /**
         * Production applications would usually process the message here.
         * Eg: - Syncing with server.
         *     - Store message in local database.
         *     - Update UI.
         */

        /**
         * In some cases it may be useful to show a notification indicating to the user
         * that a message was received.
         */
        sendNotification(message);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received GCM message.
     *
     * @param message GCM message received.
     */
    private void sendNotification(String message) {
        /*Intent intent = new Intent(this, SplashScreen.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 *//* Request code *//*, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle("GCM Message")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 *//* ID of notification *//*, notificationBuilder.build());*/
        Log.v("notification message",message);
    }
}

Но всякий раз, когда сообщение, полученное от сервера, onMessageReceived должен вызываться в вышеупомянутом слушателе. В функции onMessageReceived есть две функции регистрации, чтобы показать сообщение и отправителя. Это также не выполняется. Это означает, что сама функция не выполняется. Ниже я добавил содержание манифеста.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.greenboards.base"
    Android:versionCode="1"
    Android:versionName="1.0">

    <uses-sdk
        Android:minSdkVersion="9"
        Android:targetSdkVersion="19" />

    <!-- Application Permissions -->
    <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="com.google.Android.c2dm.permission.RECEIVE" />

    <permission
        Android:name="com.greenboards.base.permission.C2D_MESSAGE"
        Android:protectionLevel="signature" />

    <uses-permission Android:name="com.greenboards.base.permission.C2D_MESSAGE" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.VIBRATE" />

    <!-- Application Configuration and Activities -->
    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme">
        <activity Android:name=".SplashScreen">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- [START gcm_receiver] -->
        <receiver
            Android:name="com.google.Android.gms.gcm.GcmReceiver"
            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.greenboards.base" />
            </intent-filter>
        </receiver>
        <!-- [END gcm_receiver] -->

        <!-- [START gcm_listener] -->
        <service
            Android:name="com.greenboards.base.MyGcmListenerService"
            Android:exported="false" >
            <intent-filter>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
        <!-- [END gcm_listener] -->
        <!-- [START instanceId_listener] -->
        <service
            Android:name="com.greenboards.base.MyInstanceIDListenerService"
            Android:exported="false">
            <intent-filter>
                <action Android:name="com.google.Android.gms.iid.InstanceID"/>
            </intent-filter>
        </service>
        <!-- [END instanceId_listener] -->
        <service
            Android:name="com.greenboards.base.RegistrationIntentService"
            Android:exported="false">
        </service>

    </application>
</manifest>

До сих пор я не могу отладить в чем проблема. Я делаю что-то не так или я что-то упускаю?

12
Mahendran Sakkarai

Согласно этой ссылке у вас должна быть пара значков/ключей.

Проверьте параметр значка полезной нагрузки уведомления. Это указывается по мере необходимости.

Итак, вы должны включить значок в JSON.

Примером может быть 

{
    "to":   
"ci4ZzC4BW....",  
    "notification": {  
        "title": "Testing",  
        "body": "Success",  
        "icon": "@drawable/myicon"  
    }  
}

myicon - это изображение с именем myicon.png в папке drawable в приложении.

onMessageReceived вызывается при получении сообщения с полезной нагрузкой data. Когда мы изменим notification на data (как показано ниже) в вышеупомянутом json, будет вызвана функция onMessageReceived.

{
    "to":   
"ci4ZzC4BW....",  
    "data": {  
        "title": "Testing",  
        "body": "Success",  
        "icon": "@drawable/myicon"  
    }  
}
12
rohitsakala

Я сталкиваюсь с той же проблемой

посмотрите на информацию в logcat:

dalvikvm﹕ Could not find method Android.app.Notification$Builder.setColor, referenced from method com.google.Android.gms.gcm.zza.zzv

dalvikvm﹕ VFY: unable to resolve virtual method 173: Landroid/app/Notification$Builder;.setColor (I)Landroid/app/Notification$Builder;

и ссылка на документацию по API: http://developer.Android.com/reference/Android/app/Notification.Builder.html

поиск "setColor", вы обнаружите, что он добавлен в "API уровень 21", означает, что этот метод работает только выше 5.0 (Lollipop)

Я попробовал тестирование структуры ниже на 2 разных устройствах ОС, 5.0 и 4.4 соответственно, и работаю только на 5.0

{"to": "/topics/global","data": {"message": "<message>"},"notification": {"icon": "ic_stat_ic_notification","body": "Use Gradle Command","title": "Self test"}}

Примечание: Я использую тест JSON на OS 5.0, уведомление показывается, но onMessageReceived все еще не вызывается

0
Ivan

Хотя это была старая ветка, я хотел добавить к этому некоторые проблемы, с которыми я столкнулся.

Приложение имеет два состояния: активный и неактивный.

Если приложение активно, отправка notification без значка value (я подозреваю, что ключ все еще требуется) все равно будет работать. У меня работает, но ключ все еще там. 

Мой объект JSON выглядит так:

.., icon=, sound=default, title=Bruce...

Из документации для разработчиков:

Для активного приложения Android полезные нагрузки уведомлений передаются в onMessageReceived () под ключом уведомления в комплекте данных.

Когда приложение неактивно:

Уведомления доставляются в панель уведомлений, когда приложение неактивный.

И вот, когда я столкнулся с проблемой Missing icon. Таким образом, пара ключ-значение необходима, если приложение неактивно.

Если полезная нагрузка является уведомлением, убедитесь, что она всегда содержит пару ключ/значение icon, чтобы она работала, как ожидается, независимо от того, активно ли приложение или нет.

Смотрите здесь для деталей

Наконец, в дизайне приложения должно быть четкое различие между тем, что такое notification и что такое data. Я использовал notification для всех Push-сообщений для моего приложения, что я считаю неправильным способом сделать это.

0
srinij