17

मैं वर्तमान में एक ऐसा एप्लिकेशन बना रहा हूं जो नई Google क्लाउड मैसेजिंग सिस्टम का उपयोग करे। मेरे पास एक मोबाइल क्लाइंट सर्वर है जो मुझे अपने मोबाइल उपकरणों के माध्यम से परीक्षण करने की अनुमति देने के लिए एक लाइव वातावरण पर स्थापित है, लेकिन जब भी मैं जीसीएम के साथ पंजीकरण करने का प्रयास करता हूं तो मुझे आईओएक्सप्शन प्राप्त होता है जो बताता है कि gcm.register() मुझे अज्ञात स्रोत प्राप्त करने से रोक रहा है पंजीकरण आईडी मुझे अपने सर्वर को अपने डिवाइस पर संदेश भेजने की अनुमति देने की आवश्यकता है।नया जीसीएम एपीआई रजिस्टर अज्ञात स्रोत त्रुटि

मैंने यह देखने के लिए कई बार जांच की है कि मेरा प्रेषक आईडी गलत है या नहीं और मैंने अपने मैनिफेस्ट पर भी जांच की है और यह भी देखने के लिए कि क्या मेरे पास यह गलत है और मुझे समस्या नहीं मिल रही है। चारों ओर देखकर भी मेरी समस्या का कोई जवाब नहीं दिया है।

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="koodoo.pushtest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <!-- 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="koodoo.pushtest.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="koodoo.pushtest.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" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="koodoo.pushtest.MainActivity" 
      android:label="@string/app_name" > 

     </activity> 

     <receiver 
      android:name="com.google.android.gcm.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="koodoo.pushtest" /> 
      </intent-filter> 
     </receiver> 

     <service android:name="com.google.android.gcm.GCMIntentService" /> 

     <activity 
      android:name="koodoo.pushtest.RegisterActivity" 
      android:label="@string/title_activity_register" > 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

इसे ठीक करने के किसी भी मदद की बहुत सराहना की जाएगी:

07-18 11:34:25.487: W/System.err(3093): java.io.IOException: MAIN_THREAD 
07-18 11:34:25.497: W/System.err(3093):  at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source) 
07-18 11:34:25.497: W/System.err(3093):  at koodoo.pushtest.MainActivity.onCreate(MainActivity.java:94) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.Activity.performCreate(Activity.java:4492) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
07-18 11:34:25.497: W/System.err(3093):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-18 11:34:25.497: W/System.err(3093):  at android.os.Looper.loop(Looper.java:137) 
07-18 11:34:25.497: W/System.err(3093):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
07-18 11:34:25.497: W/System.err(3093):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-18 11:34:25.497: W/System.err(3093):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-18 11:34:25.497: W/System.err(3093):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-18 11:34:25.497: W/System.err(3093):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-18 11:34:25.497: W/System.err(3093):  at dalvik.system.NativeStart.main(Native Method) 

यहाँ मेरी प्रकट है:

यहाँ मेरी लॉग है।

उत्तर

27

त्रुटि मिल रहा है है कि:

java.io.IOException: MAIN_THREAD 

इसका मतलब है कि आप मुख्य थ्रेड, जिसकी अनुमति नहीं है से रजिस्टर विधि बुला रहे हैं। आपको इसे दूसरे थ्रेड से कॉल करना चाहिए।

सार्वजनिक स्थिर अंतिम स्ट्रिंग ERROR_MAIN_THREAD

GCM तरीकों अवरुद्ध कर रहे हैं। आपको उन्हें मुख्य धागे या प्रसारण रिसीवर में नहीं चलाया जाना चाहिए। लगातार मूल्य: "MAIN_THREAD"

यहाँ GCM documentation से एक कोड नमूना है:

/** 
* Registers the application with GCM servers asynchronously. 
* <p> 
* Stores the registration id, app versionCode, and expiration time in the 
* application's shared preferences. 
*/ 
private void registerBackground() { 
    new AsyncTask() { 
     @Override 
     protected String doInBackground(Void... params) { 
      String msg = ""; 
      try { 
       if (gcm == null) { 
        gcm = GoogleCloudMessaging.getInstance(context); 
       } 
       regid = gcm.register(SENDER_ID); 
       msg = "Device registered, registration id=" + regid; 

       // You should send the registration ID to your server over HTTP, 
       // so it can use GCM/HTTP or CCS to send messages to your app. 

       // For this demo: we don't need to send it because the device 
       // will send upstream messages to a server that echo back the message 
       // using the 'from' address in the message. 

       // Save the regid - no need to register again. 
       setRegistrationId(context, regid); 
      } catch (IOException ex) { 
       msg = "Error :" + ex.getMessage(); 
      } 
      return msg; 
     } 

     @Override 
     protected void onPostExecute(String msg) { 
      mDisplay.append(msg + "\n"); 
     } 
    }.execute(null, null, null); 
} 
+0

यह बहुत बहुत शुक्रिया बहुत सराहना – MarcD

+0

काम मेरे लिए काम नहीं, मैं एंड्रॉयड दस्तावेज़ से एक डेमो बनाने के रूप में आप ऊपर उल्लेख है, मैं डेवलपर साइट से सभी कोड बनाने, लेकिन अभी भी मुझे मिल गया एक ही IOException ... –

8

1.Just सीजीएम आईडी प्राप्त करने के लिए GCMHelper वर्ग पैदा करते हैं।

public final class GCMHelper { 

static GoogleCloudMessaging gcm = null; 

static Context context= null; 

public GCMHelper (Context context) 
{ 
    this.context= context; 
} 

public String GCMRegister (String SENDER_ID) throws Exception 
{ 
    String regid = ""; 
    //Check if Play store services are available. 
    if(!checkPlayServices()) 
     throw new Exception("Google Play Services not supported. Please install and configure Google Play Store."); 

    if (gcm == null) { 
     gcm = GoogleCloudMessaging.getInstance(context); 
    } 
    regid = gcm.register(SENDER_ID); 

    return regid; 
} 


private static boolean checkPlayServices() { 
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     return false; 
    } 
    return true; 
} 
} 

2.Then गतिविधि में में GetGCM() विधि पैदा करते हैं।

//**To avoid java.io.IOException: MAIN_THREAD**  

private void GetGCM() { 

    Thread thread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       GCMHelper gcmRegistrationHelper = new GCMHelper (
      getApplicationContext()); 
       String gcmRegID = gcmRegistrationHelper.GCMRegister(SENDER_ID); 

      } catch (Exception bug) { 
       bug.printStackTrace(); 
      } 

     } 
    }); 

    thread.start(); 
} 

3.Then कॉल GetGCM() विधि भी आप चाहते हैं।

4.happy कोडिंग ...

+0

काम करता है .. बहुत बहुत धन्यवाद – asmgx

+0

मैंने कई विकल्पों की कोशिश की, यह काम करता है! आपका बहुत बहुत धन्यवाद। – Leon

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