2016-01-05 5 views
8

प्राप्त मैं उदाहरण है कि गूगल gcm टोकन रजिस्टर करने के लिए प्रदान करता है अनुसरण कर रही हूं: https://developers.google.com/cloud-messaging/android/startसदस्यता ली जा रही विषयों, अमान्य तर्क

मैं सही ढंग से गूगल-services.json फ़ाइल उत्पन्न है और मैं कर रहा हूँ पुश टोकन प्राप्त करें। लेकिन जब मैं अनुसरण कोड के साथ किसी भी विषय की सदस्यता के लिए कोशिश कर रहा हूँ:

e3r6xnFGK3E:APA91bG9oY0A7QCf86BXXh8ADzycct5QJUONTXMH3pApCkcwty0A6UXo6zLLx3Hl3ubMgBY65ldxuZzSF20nahZAq-4SiUMRS0YYStJtldK85lzrO-xM5KvM_Jigpaka-RN5TLb8D1Op 
:

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) 

यह धक्का टोकन का एक उदाहरण है कि मैं प्राप्त करता है:

// 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); 

यह INVALID_ARGUMENT अपवाद फेंकता

मैंने किसी विषय की सदस्यता लेने के बारे में प्रलेखन की जांच की है लेकिन कुछ भी नहीं है जो कहता है कि मुझे INVALID_PARAMETER अपवाद क्यों प्राप्त हो रहा है:

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

किसी भी मदद की सराहना की जाती है।

पीडी। वहाँ टोकन रजिस्टर करने के लिए पूरा स्रोत कोड है:

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); 
     } 
    } 
} 

और यह गूगल-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" 
} 
+0

मुझे लगता है कि समस्याएं प्राप्त करने में समस्या का उपयोग करने के साथ समस्या है। बदले 'InstanceID InstanceID = InstanceID.getInstance (this);' को 'InstanceID InstanceID = InstanceID.getInstance (getApplicationContext());' और भी 'GcmPubSub pubsub = GcmPubSub.getInstance (यह) ; से 'GcmPubSub pubSub = GcmPubSub।getInstance (getAplicationContext()); ' यह सुनिश्चित करने के लिए कि वे एक ही संदर्भ में हैं। – gerardnimo

+0

हाय: उत्तर के लिए धन्यवाद। मुझे नहीं लगता कि यह मुद्दा है। कोड लगभग 40% समय में काम करता है। तो, कोड चल रहा है, जबकि कुछ स्थिति बदलना चाहिए। पंजीकरणIntentService IntentService से फैली हुई है, जो सेवा से फैली हुई है, जो ContextWrapper से फैली हुई है, जो संदर्भ से ही फैली हुई है। यह मुद्दा नहीं होना चाहिए। – jiahao

+0

मैं देखता हूं। क्या आपने टोकन की जांच कर रहे हैं या आप टोकन प्राप्त करने में gcm.register() का उपयोग कर रहे हैं, ये समस्या उत्पन्न करने वाले हो सकते हैं। – gerardnimo

उत्तर

4

की सामग्री ऐसा लगता है कोई भी अब तक इस समस्या को हल किया है, इसलिए मैं मैं जो समाधान मिला वह देने जा रहा हूं।

समस्या यह थी कि हमारे पास कई प्रक्रियाएं हैं जो जीसीएम पंजीकृत करती हैं। तो 60% मामलों में क्या होता है कि एक ही ऐप में, हम अपने डिवाइस को पंजीकृत करने के बाद, दूसरी प्रक्रिया जीसीएम पर अपने प्रेषक के साथ पंजीकृत होती है। इस प्रकार जब हम किसी विषय की सदस्यता लेने का प्रयास कर रहे थे, तो जीसीएम टोकन मान्य नहीं है क्योंकि एक ही डिवाइस, एक ही ऐप ने दूसरे प्रेषक के लिए जीसीएम पंजीकृत किया है।

समस्या को हल करने के लिए, हमने जो किया है उसे प्रेषक आईडी को दूसरी प्रक्रिया से प्राप्त करना है, फिर इसे हमारे प्रेषक से संलग्न करें।

मान लें कि हमारी प्रेषक आईडी "1234567" है, और उसकी प्रेषक आईडी "7654321" है, इसलिए जब हम केवल "1234567" को पार्स करने के बजाय जीसीएम पर अपना ऐप पंजीकृत करते हैं, तो हम "1234567,7654321" का उपयोग करते हैं, प्रगाढ़ बेहोशी।

यह हमें एक जीसीएम टोकन प्राप्त करने की अनुमति देता है जो हमारे लिए और दूसरी प्रक्रिया के लिए मान्य है, जबकि यदि कोई अन्य प्रक्रिया हमारे बाद जीसीएम पंजीकृत करती है, तो यह स्वयं के जीसीएम टोकन को अमान्य नहीं करेगा। (उनका जीसीएम टोकन अभी भी मान्य होगा क्योंकि हम अनुरोधकर्ता के रूप में इसके प्रेषक को शामिल करते हैं)।

दुबई से चीयर्स!

+0

मुझे इस जवाब में रूचि है, हालांकि आप कैसे "किसी अन्य प्रक्रिया से प्रेषक आईडी प्राप्त करते हैं, फिर इसे हमारे प्रेषक से संलग्न करें।" ? – Rippo

+0

यह थोड़ी देर हो गया है जब मैं इस पर काम कर रहा था। मुझे सही जवाब के बारे में निश्चित नहीं है। प्रेषक आईडी आपके पास मैनिफेस्ट में कुछ है। मुझे लगता है कि बस इसे वहाँ जोड़ें। – jiahao

संबंधित मुद्दे