Android GCM Не удалось создать экземпляр приемника

Я пытаюсь реализовать push-уведомления Android для приложения. Я выполнил следующие действия: ссылка

Однако, когда я пытаюсь запустить приложение на своем устройстве, я получаю сообщение об ошибке, что GcmBroadcastReceiver не найден в моем apk... хотя он там есть.

У меня есть google-play-services-lib в моей рабочей области как библиотека. У меня есть мой проект, связанный с этой библиотекой.

Ниже приведена ошибка, которую я получаю при сбое.

04-15 20:59:28.722: E/AndroidRuntime(10970): FATAL EXCEPTION: main
04-15 20:59:28.722: E/AndroidRuntime(10970): java.lang.RuntimeException: Unable to instantiate receiver sg.ignitedigital.AllAccess.GcmBroadcastReceiver: java.lang.ClassNotFoundException: Didn't find class "sg.ignitedigital.AllAccess.GcmBroadcastReceiver" on path: /data/app/sg.ignitedigital.AllAccess-1.apk
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2493)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.app.ActivityThread.access$1600(ActivityThread.java:159)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1392)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.os.Looper.loop(Looper.java:137)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.app.ActivityThread.main(ActivityThread.java:5419)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at java.lang.reflect.Method.invokeNative(Native Method)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at java.lang.reflect.Method.invoke(Method.java:525)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at dalvik.system.NativeStart.main(Native Method)
04-15 20:59:28.722: E/AndroidRuntime(10970): Caused by: java.lang.ClassNotFoundException: Didn't find class "sg.ignitedigital.AllAccess.GcmBroadcastReceiver" on path: /data/app/sg.ignitedigital.AllAccess-1.apk
04-15 20:59:28.722: E/AndroidRuntime(10970):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:64)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
04-15 20:59:28.722: E/AndroidRuntime(10970):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2488)
04-15 20:59:28.722: E/AndroidRuntime(10970):    ... 10 more

Вот как я добавил сервис и приемник в файл манифеста:

    <permission android:name="sg.ignitedigital.AllAccess.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="sg.ignitedigital.AllAccess.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <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="sg.ignitedigital.AllAccess" />
        </intent-filter>
    </receiver>        

    <service android:name="sg.ignitedigital.AllAccess.GcmIntentService" />

Я пытался исправить это так много раз. Почему он не находит мой файл GcmBroadcastReceiver, если он есть в пакете... .

Фиксированный:

В конце концов я нашел проблему. В моем случае у меня был проект библиотеки, используемый моим проектом, в котором была версия jar поддержки v4, а в моем проекте была другая версия jar поддержки v4. Поскольку они не совпадали, я получал эту ошибку. Как только я синхронизировал ту же версию библиотеки поддержки, все заработало.


person George Mincila    schedule 15.04.2014    source источник
comment
попробуйте этим способом, я уверен, что это решит вашу проблему.   -  person Pankaj Arora    schedule 15.07.2014
comment
также вы получаете исключение class not found. Для этого вам нужно проверить библиотеку поддержки в порядке и экспортировать вкладку пути сборки.   -  person Pankaj Arora    schedule 15.07.2014
comment
Проверьте это: stackoverflow.com/a/21898031/1785412   -  person Siddharth_Vyas    schedule 16.07.2014


Ответы (1)


Я также столкнулся с той же проблемой в течение всего утра. Я проверил как StackOverflow, так и сам Google.

Проблема заключается в том, что когда вы расширяете WakefulBroadcastReceiver для создания GcmBroadcastReceiver, необходимо экспортировать библиотеку поддержки v4 для инициализации класса. В противном случае вы столкнетесь с проблемой ClassNotFoundException во время выполнения, в моем случае, потому что библиотека поддержки находится в папке libs и точно не экспортируется в путь сборки Java.

So, the thorough steps are <br />
1. get the proper android-support-v4-libs from your android base folder (android-sdk-XXX/extras/android/support/v4/android-support-v4.jar). <br />
2. put under **libs** folder of your main project. (override other android-support-v4-libs.jar if you have other project referencing from your main project). <br />
3. Right Click on android-support-v4-libs.jar > Build > Add to Build Path.

Другие моменты, которые нужно проверить в AndroidManifest.xml:

<receiver
 android:name=".receiver.GcmBroadcastReceiver"
 android:permission="com.google.android.c2dm.permission.SEND" 
 android:exported="true"
 android:enabled="true"
 >
 <intent-filter>
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      <category android:name="yourApplicationPackageName" />
 </intent-filter>
</receiver>

<service
    android:name=".GcmIntentService"
    />
person Aung Pyae    schedule 15.07.2014
comment
На самом деле проблема в моем случае заключалась в том, что у меня был проект библиотеки, используемый моим проектом, в котором была версия jar поддержки v4, а в моем проекте была другая версия jar поддержки v4. Поскольку они не совпадали, я получал эту ошибку. Как только я синхронизировал ту же версию библиотеки поддержки, все заработало. - person George Mincila; 16.07.2014
comment
да. У меня тоже был такой опыт. Но даже если ваши библиотеки v4 синхронизируются, ваш основной проект не экспортирует библиотеки v4, которые он использует, у вас также будет эта проблема. - person Aung Pyae; 18.07.2014