1

I am trying to implement a notification server for an android app. I followed the tutorial http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ and its working fine. 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. My notification server successfully sends the regid to the gcm but I am not receiving notification on my device. My onReceive() is not getting called now. This is the response which my server has received from 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);
}
 }
SwagDevelopers
  • 99
  • 1
  • 10

2 Answers2

0

If you are getting success message like below from GCM server then your device must be received notification

Success Message from GCM Server

{
    "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.
  2. Wrong Google API Key at Server side (PHP).
  3. Wrong Device Registration ID which you are sending to GCM server.

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.

<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" />
Niranj Patel
  • 35,286
  • 11
  • 96
  • 128
  • I am sending corrent regId receiving from regId=gcm.register() message. Api key is also correct .checked twice. – SwagDevelopers May 18 '16 at 06:06
  • I saw this post http://stackoverflow.com/questions/21515141/broadcastreceiver-is-never-called-using-gcm-service seems as if having similar problem but the solution and reason I didn't understand. – SwagDevelopers May 18 '16 at 06:08
0

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. Or the firewall of your server blocks messages of the gcm as in 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.

Community
  • 1
  • 1
jobbert
  • 2,655
  • 17
  • 38