2013-10-02 5 views
0

Я разрабатываю свое первое приложение для Android. Я искал до конца, но до сих пор не могу добраться до решения, и у меня больше нет времени до финиша.Приложение GCM не получает сообщения

Мое приложение может зарегистрироваться на серверах GCM. Мой сервер еще не готов, но я проверяю отправку сообщений (server-> device), отправляя их через онлайн-сервис (обратите внимание, GCM возвращает успех по этим сообщениям). Проблема в том, что, похоже, из службы GooglePlay в мой приемник не поступает сообщений.

Начиная от руководства разработчика Android, насторить эти куски кода:

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<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" /> 
<uses-permission android:name="it.uniroma1.informatica.didapp.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="it.uniroma1.informatica.didapp.permission.C2D_MESSAGE" /> 

    <receiver 
     android:name="it.uniroma1.informatica.didapp.remote.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="it.uniroma1.informatica.didapp" /> 
     </intent-filter> 
    </receiver> 
    <service android:name="it.uniroma1.informatica.didapp.remote.GCMIntentService" /> 

GCMBroadcastReceiver.java

public class GCMBroadcastReceiver extends WakefulBroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName()); 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
} 

}

и, наконец, , GCMIntentService.java

public class GCMIntentService extends IntentService { 
public static final int NOTIFICATION_ID = 1; 
private NotificationManager mNotificationManager; 
NotificationCompat.Builder builder; 

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

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    String messageType = gcm.getMessageType(intent); 

    if (!extras.isEmpty()) { 
       if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
      sendNotification("Send error: " + extras.toString()); 
     } else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
      sendNotification("Deleted messages on server: " + extras.toString()); 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
      sendNotification("Message: " + extras.toString()); 
     } 
    } 
    GCMBroadcastReceiver.completeWakefulIntent(intent); 
} 

private void sendNotification(String msg) { 
    mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Start.class), 0); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
     .setContentTitle("GCM Notification") 
     .setStyle(new NotificationCompat.BigTextStyle() 
     .bigText(msg)) 
     .setContentText(msg); 

    mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
} 
} 

Все, что мне нужно, это очень просто:

  1. посыл сервера уведомление (без полезной нагрузки) для GCM
  2. GCM направляет его в устройство (а)
  3. устройств показывает уведомление в системной панели и в конце концов начать деятельность

ответ

0

Я считаю, что это может быть проблема:

ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());

context.getPackageName() возвращает it.uniroma1.informatica.didapp, но ваша цель сервис находится в it.uniroma1.informatica.didapp.remote. Попробуйте переместить его в основной пакет приложения.

общественный ComponentName (String упак, Струнный ЦБС)

Добавлена ​​в уровне API 1

Создать новый идентификатор компонента.

Параметры

PKG Имя пакета, который существует компонент в. Не может быть нулевым.

cls Название класса внутри pkg, который реализует компонент. Не может быть null.

+0

Я пытался как переместить класс внутри основного пакета и заменить аргументы конструктора ComponentName, но проблема не решена :( –

+0

@OliverTran ли 'onReceive' когда-нибудь звонил? Может быть, вы должны запустить приложение в отладчик и поставить точку останова внутри этого метода. – Eran

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