2016-06-03 3 views
0

Я следил за «примером быстрого запуска» и инструкциями последней версии google cloud message в ссылке https://developers.google.com/cloud-messaging/android/client и загружал проект из этой инструкции. Мне удалось получить токен устройства, и у меня есть php-сервер для отправки в облако Google, но я не могу получить сообщение с моего устройства. Не могли бы вы здесь помочь.google cloud message 3.0 device not receive message

загрузить проект с этого сайта, который рекомендуется в этой ссылке выше

$ мерзавца клона https://github.com/googlesamples/google-services.git

Ниже мой код сервера

gcm.php

// Payload data you want to send to Android device(s) 
     // (it will be accessible via intent extras)  
     $data = array('message' => 'Hello World!'); 

     // The recipient registration tokens for this notification 
     // https://developer.android.com/google/gcm/ 

     $ids = array('foD2qlwvb9U:APA91bGOD6VD8GxGtZXmg-oFwDElMCXNOxptLXvNL3NHzKenwUYKzUFUbIapBhuuOW2ee8oC3ZUPdGRcjmOrA5B4zrzG_UQtj7soqjisM4NUHe4L4IfSjoWRiXKJfQ_918XDgX11hWdT'); 

     // Send push notification via Google Cloud Messaging 
     sendPushNotification($data, $ids); 

     function sendPushNotification($data, $ids) 
     { 
      // Insert real GCM API key from the Google APIs Console 
      // https://code.google.com/apis/console/    

      // Set POST request body 
      $post = array(
          'registration_ids' => $ids, 
          'data'    => $data, 
         ); 

      // Set CURL request headers 
      $headers = array( 
           'Authorization: key=AIzaSyCGw1NOaemsZWUFbUWcLCPP5p_Kcvmc9mg', 
           'Content-Type: application/json' 
          ); 

      // Initialize curl handle  
      $ch = curl_init(); 

      // Set URL to GCM push endpoint  
      //curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send'); 
      curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send'); 

      // Set request method to POST  
      curl_setopt($ch, CURLOPT_POST, true); 

      // Set custom request headers  
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

      // Get the response back as string instead of printing it  
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

      // Set JSON post data 
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post)); 

      // Actually send the request  
      $result = curl_exec($ch); 

      // Handle errors 
      if (curl_errno($ch)) 
      { 
       echo 'GCM error: ' . curl_error($ch); 
      } 

      // Close curl handle 
      curl_close($ch); 

      // Debug GCM response  
      echo $result; 


     } 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="gcm.play.android.samples.com.gcmquickstart" > 

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/> 
    <!-- [START gcm_permission] --> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 


    <permission android:name="gcm.play.android.samples.com.gcmquickstart.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="gcm.play.android.samples.com.gcmquickstart.permission.C2D_MESSAGE" /> 

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

    <!-- Permission to vibrate --> 
    <uses-permission android:name="android.permission.VIBRATE" /> 

    <!-- [END gcm_permission] --> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="gcm.play.android.samples.com.gcmquickstart.MainActivity" 
      android:label="@string/app_name" > 
      <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="gcm.play.android.samples.com.gcmquickstart" /> 

      </intent-filter> 
     </receiver> 
     <!-- [END gcm_receiver] --> 

     <!-- [START gcm_listener] --> 
     <service 
      android:name="gcm.play.android.samples.com.gcmquickstart.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="gcm.play.android.samples.com.gcmquickstart.MyInstanceIDListenerService" 
      android:exported="false"> 
      <intent-filter> 
       <action android:name="com.google.android.gms.iid.InstanceID"/> 
      </intent-filter> 
     </service> 
     <!-- [END instanceId_listener] --> 
     <service 
      android:name="gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService" 
      android:exported="false"> 
     </service> 
    </application> 

</manifest> 

MyGcmListenerService.java

package gcm.play.android.samples.com.gcmquickstart; 

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.google.android.gms.gcm.GcmListenerService; 

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) { 
     Log.d(TAG, "onMessageReceived"); 
     String message = data.getString("message"); 
     Log.d(TAG, "From: " + from); 
     Log.d(TAG, "Message: " + message); 

     if (from.startsWith("/topics/")) { 
      // message received from some topic. 
     } else { 
      // normal downstream message. 
     } 

     // [START_EXCLUDE] 
     /** 
     * 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_EXCLUDE] 
    } 
    // [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, MainActivity.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()); 
    } 
} 

Я получил сообщение от сервера:

{ "multicast_id": 5585998123799628757, "успех": 1, "неудача": 0 , "canonical_ids": 0, "results": [{"message_id": "0: 1464946787970982% 744ab298f9fd7ecd"}]}

Я googled много учебник, блог, но мое устройство все еще не может получить сообщение. Я что-то пропустил? Мой интернет хорош, потому что я могу открыть веб-страницу.

SOLVED: Я перехожу к firebase cloud message, и он работает. Спасибо всем друзьям, которые мне помогают.

+1

Поскольку вы получили ответ успеха, вероятно, что этот вопрос находится на стороне клиента (Android) стороне. Не могли бы вы добавить свою реализацию MyGcmListenerService в свой вопрос? –

+0

Бэкэнд-код кажется прекрасным. Если я прав, вы используете шаблон. Я второй Артур на этом. Возможно, с вашим GCMListenerService –

+0

Уважаемый @Arthur Thompson, я редактировал мой пост, добавляя код MyGcmListenerService.java. Спасибо за ваш ответ –

ответ

0

Попробуйте следующие обходные пути:

  • Убедитесь, что вы установили свой Sender ID вы получили от Google правильно.
  • Убедитесь, что ваше устройство зарегистрировано в сервисе Google GCM правильно.
  • Убедитесь, что вы отправляете push к правильному региону reg, который вы получили от Google. и что вы не получили сообщение об ошибке в сервисе Google GCM.
  • Измените его на delay_while_idle = 0, если вы хотите, чтобы ваше разрешение на wakelock имело какое-либо значение. Если оно установлено на delay_while_idle = 1, сообщение не дойдет до устройства, если оно не работает.
  • Несколько раз требуется время для поступления (но не слишком много времени, тогда есть проблема). Проверьте, что такое «время жить» от нажатия, которое вы отправили.

Вы также можете проверить эти вопросы, связанные с:

+0

Дорогой @abielita, является ли «SENDER ID» ключом сервера в «Credentials»? Мое устройство зарегистрировано в GCM, потому что я могу получить ответ ключа маркера из GCM с помощью logcat. Я тестирую свое устройство NovaP в компании, но когда я перехожу в другое место с другой настройкой сети, мое устройство может получить сообщение от GCM, которое было отправлено ранее. Я думаю, что проблема связана с настройкой сети. –

+0

И я слышал, что нам нужно разрешить порт 5228. Это правильно ? Если это правильно, что я могу сделать, чтобы разрешить порт 5228. И что произойдет, если другая настройка сети не позволит порт 5228? Как мы можем использовать GCM везде? –

Смежные вопросы