2012-08-07 21 views
6

मैं google क्लाउड संदेश प्रणाली का उपयोग कर एक ग्राहक रिसीवर सेट करने का तरीका जानने के लिए कोशिश कर रहा हूँ और मैं इसे Google के ट्यूटोरियल अनुसरण कर रहा हूँ का दृष्टांत करने में असमर्थ सब कुछ है कि ट्यूटोरियल पूछता है लेकिन जब मैं अपने एप्लिकेशन को चलाने के लिए यह एक पल के लिए काम करता है और फिर इसे दुर्घटनाओं और इस LogCat है:java.lang.RuntimeException: <a href="http://developer.android.com/guide/google/gcm/gs.html#android-app">http://developer.android.com/guide/google/gcm/gs.html#android-app</a></p> <p>मैंने किया है: सेवा .GCMIntentService

08-07 17:04:40.726: E/AndroidRuntime(8155): FATAL EXCEPTION: main 
08-07 17:04:40.726: E/AndroidRuntime(8155): java.lang.RuntimeException: Unable to instantiate service com.example.google.cloud.messaging.GCMIntentService: java.lang.ClassNotFoundException: com.example.google.cloud.messaging.GCMIntentService in loader dalvik.system.PathClassLoader[/data/app/com.example.google.cloud.messaging-1.apk] 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:1933) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.app.ActivityThread.access$2500(ActivityThread.java:117) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:989) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.os.Looper.loop(Looper.java:130) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at java.lang.reflect.Method.invoke(Method.java:507) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at dalvik.system.NativeStart.main(Native Method) 
08-07 17:04:40.726: E/AndroidRuntime(8155): Caused by: java.lang.ClassNotFoundException: com.example.google.cloud.messaging.GCMIntentService in loader dalvik.system.PathClassLoader[/data/app/com.example.google.cloud.messaging-1.apk] 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
08-07 17:04:40.726: E/AndroidRuntime(8155):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:1930) 

यह मेरा कोड है

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     final String regId = GCMRegistrar.getRegistrationId(this); 
     if (regId.equals("")) { 
      GCMRegistrar.register(this, "962129210868"); 
      Log.i("Registrando",""); 
     } else { 
      Log.i("Test", "Already registered"); 
     } 
    } 
} 

और यह है मेरी प्रकट

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.google.cloud.messaging" 
    android:versionCode="1" 
    android:versionName="1.0" > 

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

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <permission 
     android:name="com.example.google.cloud.messaging.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.example.google.cloud.messaging.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="com.example.google.cloud.messaging" /> 
      </intent-filter> 
     </receiver> 

     <service android:name="com.example.google.cloud.messaging.GCMIntentService" android:enabled="true"/> 
    </application> 

</manifest> 

निर्धारित

मैं एक नया वर्ग कहा जाता GCMIntentService बनाने:

public class GCMIntentService extends GCMBaseIntentService { 

    @SuppressWarnings("hiding") 
    private static final String TAG = "GCMIntentService"; 

    public GCMIntentService() { 
     super("Test"); 
    } 

    @Override 
    protected void onRegistered(Context context, String registrationId) { 
     Log.i(TAG, "Device registered: regId = " + registrationId); 
    } 

    @Override 
    protected void onUnregistered(Context context, String registrationId) { 
     Log.i(TAG, "Device unregistered"); 
    } 

    @Override 
    protected void onMessage(Context arg0, Intent arg1) { 
     Log.d("GCM", "RECIEVED A MESSAGE"); 
     generateNotification(arg0, arg1.getStringExtra("message")); 
     } 

    @Override 
    protected void onDeletedMessages(Context context, int total) { 
     Log.i(TAG, "Received deleted messages notification"); 
    } 

    @Override 
    public void onError(Context context, String errorId) { 
     Log.i(TAG, "Received error: " + errorId); 
    } 

    @Override 
    protected boolean onRecoverableError(Context context, String errorId) { 
     // log message 
     Log.i(TAG, "Received recoverable error: " + errorId); 
     return super.onRecoverableError(context, errorId); 
    } 

    /** 
    * Issues a notification to inform the user that server has sent a message. 
    */ 
    private static void generateNotification(Context context, String message) { 
     int icon = R.drawable.ic_action_search; 
     long when = System.currentTimeMillis(); 
     NotificationManager notificationManager = (NotificationManager) 
       context.getSystemService(Context.NOTIFICATION_SERVICE); 
     Notification notification = new Notification(icon, message, when); 
     String title = context.getString(R.string.app_name); 
     Intent notificationIntent = new Intent(context, GCMIntentService.class); 
     // set intent so it does not start a new activity 
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
       Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent intent = 
       PendingIntent.getActivity(context, 0, notificationIntent, 0); 
     notification.setLatestEventInfo(context, title, message, intent); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 
     notificationManager.notify(0, notification); 
    } 

} 
+1

किया? –

+0

एएएएएएएएएए और यह वही था जो मुझे याद आया। बहुत बहुत धन्यवाद। कृपया इस प्रश्न का उत्तर दें ताकि मैं आपको +1 दे सकूं :) –

उत्तर

9

आप ग्राहक कोड में GCMIntentService होना चाहिए और आपको चाहिए निम्नानुसार AndroidManifest.xml फ़ाइल में इसे परिभाषित करें।

< सेवा एंड्रॉयड: नाम = "package_name.GCMIntentService" />

ध्यान दें कि आशय सेवा के नाम पर GCMIntentService के रूप में बिल्कुल वैसा ही है, तो आप GCMBroadcastReceiver का उपयोग किया जाना चाहिए। यदि आप अपना प्रसारण रिसीवर लागू करते हैं तो आप अपनी मंशा सेवा बना सकते हैं।

4

मैं एक ही समस्या थी। और यह समस्या हल हो गई थी क्योंकि आप एंड्रॉइड के रूप में GCMIntentService क्लास नाम का उपयोग कर रहे हैं। लेकिन अगर आप इस वर्ग को किसी अन्य पैकेज में बदलना या रखना चाहते हैं, तो समस्याएं वापस आती हैं :) यहां समाधान link और source code है।

समाधान:

हम रिसीवर बना सकते हैं और overrided विधि getGCMIntentServiceClassName तक अपने कस्टम सेवा के नाम पर स्थापित करना चाहिए।

public class GCMReceiver extends GCMBroadcastReceiver { 
@Override 
protected String getGCMIntentServiceClassName(Context context) { 
    return "PCAKAGE_NAME.GCMService"; 
} 
} 

जहां पीसीसीएजीएएनजीसी एक अन्य पैकेज में है, तो जीसीएमआईएनएन्टेंट सेवा एक अन्य पैकेज में है।

और भी भूल नहीं है AndroidManifest.xml में परिवर्तन रिसीवर नाम। आप com.example.google.cloud.messaging पैकेज में GCMIntentService वर्ग है