Я разрабатываю свое первое приложение для 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());
}
}
Все, что мне нужно, это очень просто:
- посыл сервера уведомление (без полезной нагрузки) для GCM
- GCM направляет его в устройство (а)
- устройств показывает уведомление в системной панели и в конце концов начать деятельность
Я пытался как переместить класс внутри основного пакета и заменить аргументы конструктора ComponentName, но проблема не решена :( –
@OliverTran ли 'onReceive' когда-нибудь звонил? Может быть, вы должны запустить приложение в отладчик и поставить точку останова внутри этого метода. – Eran