Android GCM Не може да инстанцира приемник

Опитвам се да внедря насочените известия за 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 файл, ако го има в пакета... .

Фиксиран:

В крайна сметка открих проблема. В моя случай беше, че имах библиотечен проект, използван от моя проект, който имаше версия на support v4 jar и моят проект имаше различна версия на support v4 jar. Тъй като те не съвпадаха, получавах тази грешка. След като синхронизирах същата версия на библиотеката за поддръжка, всичко работи добре.


person George Mincila    schedule 15.04.2014    source източник
comment
опитайте по този начин, сигурен съм ще реши проблема ви.   -  person Pankaj Arora    schedule 15.07.2014
comment
също така получавате изключение за клас, който не е намерен. За това трябва да проверите реда на библиотеката за поддръжка и раздела за експортиране на пътя на изграждане.   -  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
Всъщност проблемът в моя случай беше, че имах библиотечен проект, използван от моя проект, който имаше версия на support v4 jar, а моят проект имаше различна версия на support v4 jar. Тъй като те не съвпадаха, получавах тази грешка. След като синхронизирах същата версия на библиотеката за поддръжка, всичко работи добре. - person George Mincila; 16.07.2014
comment
да Аз също имах този опит. Но дори ако вашите v4 libs се синхронизират, основният ви проект не експортира v4 libs, които използва, вие също ще имате този проблем. - person Aung Pyae; 18.07.2014