Google Cloud Messenger token subscription, invalid argument received

I follow the example that Google provides for registering the gcm token: https://developers.google.com/cloud-messaging/android/start

I created the google-services.json file correctly and I can get tokens. But when I try to subscribe to any topic using the following code:

// Register the user to the global topic. This will help the device to be register on GCM GcmPubSub pubSub = GcmPubSub.getInstance(this); pubSub.subscribe(token, "/topics/global", null); 

It throws an INVALID_ARGUMENT exception:

 01-05 14:05:24.435 D/RegIntentService( 4330): java.io.IOException: INVALID_PARAMETERS 01-05 14:05:24.435 D/RegIntentService( 4330): at com.google.android.gms.iid.zzc.zzb(Unknown Source) 01-05 14:05:24.435 D/RegIntentService( 4330): at com.google.android.gms.iid.zzc.zza(Unknown Source) 01-05 14:05:24.435 D/RegIntentService( 4330): at com.google.android.gms.iid.InstanceID.zzc(Unknown Source) 01-05 14:05:24.435 D/RegIntentService( 4330): at com.google.android.gms.iid.InstanceID.getToken(Unknown Source) 01-05 14:05:24.435 D/RegIntentService( 4330): at com.google.android.gms.gcm.GcmPubSub.subscribe(Unknown Source) 01-05 14:05:24.435 D/RegIntentService( 4330): at gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.subscribeTopics(RegistrationIntentService.java:105) 01-05 14:05:24.435 D/RegIntentService( 4330): at gcm.play.android.samples.com.gcmquickstart.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:65) 01-05 14:05:24.435 D/RegIntentService( 4330): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 01-05 14:05:24.435 D/RegIntentService( 4330): at android.os.Handler.dispatchMessage(Handler.java:99) 01-05 14:05:24.435 D/RegIntentService( 4330): at android.os.Looper.loop(Looper.java:137) 01-05 14:05:24.435 D/RegIntentService( 4330): at android.os.HandlerThread.run(HandlerThread.java:60) 

This is an example of the tokens I receive:

 e3r6xnFGK3E:APA91bG9oY0A7QCf86BXXh8ADzycct5QJUONTXMH3pApCkcwty0A6UXo6zLLx3Hl3ubMgBY65ldxuZzSF20nahZAq-4SiUMRS0YYStJtldK85lzrO-xM5KvM_Jigpaka-RN5TLb8D1Op 

I checked the documentation on subscribing to a topic, but nothing says why I get an INVALID_PARAMETER exception:

https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmPubSub.html#subscribe (java.lang.String, java.lang.String, android.os.Bundle)

Any help is appreciated.

Pd There is a complete source code for registering tokens:

 import android.annotation.SuppressLint; import android.app.IntentService; import android.content.Intent; import android.os.Bundle; import android.os.ResultReceiver; import android.util.Log; import com.google.android.gms.gcm.GcmPubSub; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; /** * Intent service used to retrieve and save the registration token needed * Extracted from here * https://github.com/googlesamples/google-services/blob/master/android/gcm/app/src/main/java/gcm/play/android/samples/com/gcmquickstart/RegistrationIntentService.java */ public class RegistrationIntentService extends IntentService { public static final String TAG = "RegistrationIntentService"; public static final String INTENT_KEY_UPDATE_SERVER_TOKEN_CALLBACK = "services.RegistrationIntentService.INTENT_KEY_UPDATE_SERVER_TOKEN_CALLBACK"; private ResultReceiver mResultReceiver; public static final String BUNDLE_KEY_GCM_TOKEN = "services.RegistrationIntentService.BUNDLE_KEY_GCM_TOKEN"; public RegistrationIntentService() { super(TAG); } @SuppressLint("LongLogTag") @Override protected void onHandleIntent(Intent intent) { // Get the result receiver Bundle extras = intent.getExtras(); if (extras != null && extras.containsKey(INTENT_KEY_UPDATE_SERVER_TOKEN_CALLBACK)) { mResultReceiver = (ResultReceiver)extras.get(INTENT_KEY_UPDATE_SERVER_TOKEN_CALLBACK); } try { InstanceID instanceId = InstanceID.getInstance(this); String token = instanceId.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); Log.i(TAG, "GCM Registration Token: " + token); // TODO: Send registration token to the server if (mResultReceiver != null) { Bundle bundle = new Bundle(); bundle.putString(BUNDLE_KEY_GCM_TOKEN, token); mResultReceiver.send(0, bundle); } // Register the user to the global topic. This will help the device to be register on GCM GcmPubSub pubSub = GcmPubSub.getInstance(this); pubSub.subscribe(token, "/topics/global", null); Logger.v(TAG, "User correctly register to the global token"); } catch (Exception e) { Log.d(TAG, "Faield to complete token refresh", e); } } } 

And this is the content of google-services.json

 { "project_info": { "project_id": "NOT_SHOWN-aa10f", "project_number": "11046079110", "name": "NOT_SHOWN" }, "client": [ { "client_info": { "mobilesdk_app_id": "1:11046079110:android:b918cc51ed907631", "client_id": "android:NOT_SHOWN", "client_type": 1, "android_client_info": { "package_name": "NOT_SHOWN" } }, "oauth_client": [], "api_key": [], "services": { "analytics_service": { "status": 1 }, "cloud_messaging_service": { "status": 2, "apns_config": [] }, "appinvite_service": { "status": 1, "other_platform_oauth_client": [] }, "google_signin_service": { "status": 1 }, "ads_service": { "status": 1 } } } ], "client_info": [], "ARTIFACT_VERSION": "1" } 
+8
android google-cloud-messaging
source share
1 answer

It seems that no one has yet solved this problem, so I'm going to give the solution that I found.

The problem was that we have several processes that register GCM. So, what happens in 60% of cases is that after registering our own device in the same application, another process register on GCM with its own sender. Thus, when we tried to subscribe to a topic, the gcm token is invalid because the same device, the same application will register gcm for another sender.

To solve the problem, we made the sender ID from another process, and then attached it to our sender.

Let's say our sender ID is “1234567” and its sender ID is “7654321”, so when we register our application with GCM, instead of parsing only “1234567” we use “1234567,7654321”, separated by a coma.

This allows us to obtain a GCM token that is valid for us and for another process, and if another process registers GCM after us, this will not invalidate our own GCM token. (His GCM token will still be valid, as we include its sender as part of the request).

Greetings from Dubai!

+4
source share

All Articles