Не получает уведомление от GCM, отправленное с Notification Server

Я пытаюсь реализовать сервер уведомлений для приложения Android. Я следовал учебному руководству http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ и он работает нормально. Но теперь все, что касается серверной части, обрабатывается моим сервером уведомлений, с которым я делю идентификатор своего устройства и идентификатор пользователя при входе в систему. Мой сервер уведомлений успешно отправляет regid в gcm, но я не получаю уведомления на моем устройстве. Мой onReceive() не вызывается сейчас. Это ответ, который мой сервер получил от gcm. MessageId = 0: 1463550332634647% fd0791fdf9fd7ecd

Config.java

public interface Config {

//static final String APP_SERVER_URL = "http://192.168.100.27:8081/GCMServer/GCMNotification?shareRegId=1";//earlier it was used to share regid with server
static final String GOOGLE_PROJECT_ID = "299876636766";
static final String MESSAGE_KEY = "message";

}

GCMNotificationIntentService.java

 public class GCMNotificationIntentService extends IntentService {

public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;

public GCMNotificationIntentService() {
    super("GcmIntentService");
}

public static final String TAG = "GCMNotificationIntentService";

@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);

    String messageType = gcm.getMessageType(intent);
    System.out.println("MessageType is"+messageType);
    String msg = intent.getStringExtra("message");
    System.out.println("mESSAGE IS---->>>"+msg);

    if (!extras.isEmpty()) {
        if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
                .equals(messageType)) {
            sendNotification("Send error: " + extras.toString());
        } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
                .equals(messageType)) {
            sendNotification("Deleted messages on server: "
                    + extras.toString());
        } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
                .equals(messageType)) {

            for (int i = 0; i < 3; i++) {
                Log.i(TAG,
                        "Working... " + (i + 1) + "/5 @ "
                                + SystemClock.elapsedRealtime());
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }

            }
            Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());

            sendNotification(""+msg);
            Log.i(TAG, "Received: " + extras.toString());
        }
    }
    GcmBroadcastReceiver.completeWakefulIntent(intent);
}

private void sendNotification(String msg) {
    Log.d(TAG, "Preparing to send notification...: " + msg);
    System.out.println("Message is"+msg);
    mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);
    PendingIntent contentIntent=null ;
    if(msg.equalsIgnoreCase("call")){
        System.out.println("Inside iffffffffffffffffffffff");
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        wl.acquire();
        Intent i = new Intent(getApplicationContext(), MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
        //setResultCode(Activity.RESULT_OK)

        wl.release();
        contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, SplashScreen.class), 0);
        System.out.println("the content intent is"+contentIntent.toString());

    }else{
        System.out.println("Inside else");
        contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);


    }
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("GCM Notification")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

    Log.d(TAG, "Notification sent successfully.");
}
}

GCMBroadcastReceiver.java

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    ComponentName comp = new ComponentName(context.getPackageName(),
            GCMNotificationIntentService.class.getName());
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);
}
 }

2 ответа

Если вы получаете сообщение об успехе, как показано ниже, с сервера GCM, тогда ваше устройство должно получить уведомление

Сообщение об успешном выполнении с сервера GCM

{
    "multicast_id": 661164****4469281,
    "success": 1,
    "failure": 0,
    "canonical_ids": 1,
    "results": [{
        "registration_id": "APA91bFWKKC4Bh_B******-H",
        "message_id": "0:14635506***b6f9fd7ecd"
    }]
}

Ниже могут быть случаи, когда в устройстве не было получено сообщение.

  1. Неверный идентификатор отправителя на стороне Android.
  2. Неправильный ключ API Google на стороне сервера (PHP).
  3. Неверный идентификатор регистрации устройства, который вы отправляете на сервер GCM.

Пожалуйста, проверьте все значения сразу и проверьте. Если все идеально, то вы должны получить сообщение в устройстве. Пожалуйста, проверьте ваше интернет-соединение в устройстве.

Пожалуйста, подтвердите ваш Menifest.xml файл с ниже.

<receiver
            android:name=".GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>

                <!-- Receives the actual messages. -->
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <!-- Receives the registration id. -->
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="your_package" />
            </intent-filter>
        </receiver>

        <service android:name=".GCMIntentService" />
    </application>

    <!-- GCM connects to Internet Services. -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!-- Creates a custom permission so only this app can receive its messages. -->
    <permission
        android:name="your_package.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="your_package.permission.C2D_MESSAGE" />

    <!-- This app has permission to register and receive data message. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <!-- Network State Permissions to detect Internet status -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Если вы получили сообщения в примере кода; Я думаю, что либо IP-адрес вашего сервера не разрешен в вашем проекте gcm. Или брандмауэр вашего сервера блокирует сообщения gcm, как в /questions/1329314/pochemu-gcm-ne-daet-push-uvedomleniya-v-ustrojstve-android/1329324#1329324. В любом случае, я бы порекомендовал вам запустить автономный простой скрипт php на вашем сервере, в котором указан только ваш регистрационный идентификатор, чтобы убедиться, что его нет в коде. Вы можете найти один /questions/30465925/gcm-s-php-google-cloud-messaging/30465948#30465948.

Другие вопросы по тегам