简体   繁体   English

无法从Notification Server发送的GCM接收通知

[英]Not Receiving notification from GCM sent from Notification Server

I am trying to implement a notification server for an android app. 我正在尝试为Android应用程序实现通知服务器。 I followed the tutorial http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ and its working fine. 我遵循了http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/教程,它的工作正常。 But now the entire thing of server side is handled by my notification server with whom I share my device id and userId on user login. 但是现在,服务器端的整个事情都由我的通知服务器处理,我在用户登录时与我共享设备ID和用户ID。 My notification server successfully sends the regid to the gcm but I am not receiving notification on my device. 我的通知服务器已成功将regid发送到gcm,但是我没有在设备上收到通知。 My onReceive() is not getting called now. 我的onReceive()现在没有被调用。 This is the response which my server has received from gcm. 这是我的服务器从gcm收到的响应。 messageId=0:1463550332634647%fd0791fdf9fd7ecd 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 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 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);
}
 }

If you are getting success message like below from GCM server then your device must be received notification 如果您从GCM服务器收到如下所示的成功消息,则必须收到设备通知

Success Message from GCM Server 来自GCM服务器的成功消息

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

May be below are cases for not received message in device. 可能是以下情况:设备中未收到消息。

  1. Wrong Sender ID at android side. Android端的发件人ID错误。
  2. Wrong Google API Key at Server side (PHP). 服务器端(PHP)的Google API密钥错误。
  3. Wrong Device Registration ID which you are sending to GCM server. 您要发送到GCM服务器的设备注册ID错误。

Please verify all value at once and check. 请立即验证所有值并检查。 If all are perfect then you must be received message in device. 如果一切都完美,那么您必须在设备中收到消息。 Please check your internet connection in device. 请检查设备中的互联网连接。

Please verify your Menifest.xml file with below. 请使用以下验证您的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" />

If you did receive messages in the sample code; 如果您确实在示例代码中收到消息; I think either the IP address of your server is not allowed on your project gcm. 我认为您的项目gcm上不允许服务器的IP地址。 Or the firewall of your server blocks messages of the gcm as in https://stackoverflow.com/a/13470029/2917564 . 或者您的服务器的防火墙阻止gcm的消息,如https://stackoverflow.com/a/13470029/2917564所示 Either way I'd recommend you to run a standalone simple php script on your server with only your registration ID in it to make sure it is not in the code, you can find one https://stackoverflow.com/a/11253231/2917564 . 无论哪种方式,我都建议您在服务器上运行仅包含您的注册ID的独立简单php脚本,以确保它不在代码中,您可以找到一个https://stackoverflow.com/a/11253231/ 2917564

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM