2013-12-02 4 views
7

Я пытался создать тест приложение с GCM службы, в соответствии с руководством Google https://developer.android.com/google/gcm/client.html#appНевозможно создать экземпляр GcmBroadcastReceiver

Но когда я получаю сообщение - У меня есть эта ошибка:

Unable to instantiate receiver com.example.testpushnotification.GcmBroadcastReceiver: java.lang.ClassNotFoundException: Didn't find class "com.example.testpushnotification.GcmBroadcastReceiver" on path: DexPathList[[zip file "/data/app/com.example.testpushnotification-2.apk"], nativeLibraryDirectories=[/data/app-lib/com.example.testpushnotification-2, /vendor/lib, /system/lib]]

Я искал все те же вопросы, но у них нет решений или решений, которые не помогли или они устарели.

Мой манифест:

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


<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="18" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 

<permission android:name="com.example.testpushnotification.permission.C2D_MESSAGE" 
      android:protectionLevel="signature"/> 
<uses-permission android:name="com.example.testpushnotification.permission.C2D_MESSAGE"/> 


<application 

    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <meta-data android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version"/> 

    <activity 
     android:name="com.example.testpushnotification.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver 
     android:name=".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.testpushnotification"/> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GcmIntentService"/> 
</application> 

и исходный код для GcmBroadcastReceiver в пакете com.example.testpushnotification:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Explicitly specify that GcmIntentService will handle the intent. 
     ComponentName comp = new ComponentName(context.getPackageName(), 
       GcmIntentService.class.getName()); 
     // Start the service, keeping the device awake while it is launching. 
     startWakefulService(context, (intent.setComponent(comp))); 
     setResultCode(Activity.RESULT_OK); 
    } 

И почему Dex путь содержит пакет отличается, чем мой?

Пожалуйста, как это исправить?

FIXED Изменено <receiver android:name=".GcmBroadcastReceiver" .. </receiver>

в <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" .. </receiver> (случай чувствительный)

ответ

7

Попробуйте это:

Перейти к Project/Properties/Java Build Path/Order и Export - Убедитесь, что есть проверка перед Android-зависимостями и библиотекой поддержки, если вы ее используете. Отметьте все флажки. Нажмите на Применить и очистить проект.

Добавить как это:

<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.test.android" /> 
     </intent-filter> 
    </receiver> 

Это должно быть: com.google.android.gcm.GCMBroadcastReceiver и не .GCMBroadcastReceiver

Это работало me.Hope это помогает.

+0

Я думаю, если Android Dependencies ошибочно - я не смог зарегистрироваться. Я снова попробовал это решение, но он все еще не работает. Спасибо –

+0

Проверьте мой отредактированный ответ. –

+0

К сожалению, нет. Я также попробовал добавить имя пакета, но результата тоже нет. –

2

Я следовал developer.android учебника: /google/gcm/client.html

Моего вопроса был у меня был "Android зависимостей" галочка под Properties-> Java Build Path-> Order и экспорт.

Список соответствующих библиотек:

  • Android 4.4.2
  • Android Частных библиотеки
  • Android-поддержка-v4

Надеется, что это помогает кто-то там!

Этот код был правильно

<receiver 
    android:name=".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.infostretch.iSOSAndroid" /> 
    </intent-filter> 
</receiver> 
0

Mi Fix было использовать мастер редактор манифеста, чтобы изменить имя службы и приемника.Результат был:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/journey_icon" 
    android:logo="@drawable/journey_icon" 
    android:permission="android.permission.INTERNET" 
    android:theme="@style/AppTheme" > 

    <meta-data 
     android:name="com.google.android.gms.version"   
     android:value="@integer/google_play_services_version" /> 

    <receiver   
     android:name=".GCMBroadcastReceiver"   
     android:permission="com.google.android.c2dm.permission.SEND" >   

     <intent-filter>    
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />    
      <category android:name="com.example.JourneyApp" />   
     </intent-filter> 
    </receiver>  

    <service android:name=".GCMIntentService" /> 

Изменен

<application 
    android:allowBackup="true" 
    android:icon="@drawable/journey_icon" 
    android:logo="@drawable/journey_icon" 
    android:permission="android.permission.INTERNET" 
    android:theme="@style/AppTheme" > 

    <meta-data 
     android:name="com.google.android.gms.version"   
     android:value="@integer/google_play_services_version" /> 

    <receiver   
     android:name="journeyAux.GCMBroadcastReceiver"   
     android:permission="com.google.android.c2dm.permission.SEND" >   

     <intent-filter>    
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />    
      <category android:name="com.example.JourneyApp" />   
     </intent-filter> 
    </receiver>  

    <service android:name="journeyAux.GCMIntentService" /> 

1

Я сталкивался тот же вопрос. Но решила, позвольте мне поделиться своими шагами решения.

  • Я создал новый пакет, а затем перевел BroadcastReceiver на этот пакет.
  • Добавить Объявление приемника TAG После тега активности, который предоставляет зарегистрированный идентификатор GCM правильному имени пакета.

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

Смежные вопросы