Метод GcmBroadcastReceiver onReceive не запускается на Android 4.0.3

Я пишу программу Android 4.0.3 с поддержкой GCM. Приложение регистрируется в порядке и отправка сообщения с сервера также, похоже, работает (получение "успеха" от Google с идентификатором сообщения), однако метод onReceive моего BroadcastReceiver не уволен по какой-либо причине.

Вот манифест:

<!--?xml version="1.0" encoding="utf-8"?-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jlieberman.nightwatch" android:versioncode="1" android:versionname="1.0">
 <uses-sdk android:minsdkversion="11" android:targetsdkversion="18">
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
 <uses-permission android:name="android.permission.INTERNET">
 <uses-permission android:name="android.permission.GET_ACCOUNTS">
 <uses-permission android:name="android.permission.WAKE_LOCK">
 <uses-permission android:name="com.jlieberman.nightwatch.permission.C2D_MESSAGE">
 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE">
 <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
 <activity android:name="com.jlieberman.nightwatch.NightWatch" android:label="@string/app_name">
 <intent-filter>
 <action android:name="android.intent.action.MAIN">
 <category android:name="android.intent.category.LAUNCHER">
 </category></action></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">
 <category android:name="com.jlieberman.nightwatch">
 </category></action></intent-filter>
 </receiver>
 <service android:name=".GcmIntentService">
 </service></application>
</uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-sdk></manifest>

И вот BroadcastReceiver:

package com.jlieberman.nightwatch;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
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);
 }
}

Любая идея, что вызывает проблему? Спасибо!

3 ответа

У вас есть в вашем манифесте, но я не вижу, где вы определяете это разрешение.

Вы должны добавить:


Хорошо, пожалуйста, попробуйте

import com.google.android.gms.gcm.GoogleCloudMessaging;
 import android.app.Activity;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.support.v4.app.NotificationCompat;
 import android.util.Log;
 public class MyBroadcastReceiver extends BroadcastReceiver {
 static final String TAG = "pushnotification";
 public static final int NOTIFICATION_ID = 1;
 private NotificationManager mNotificationManager;
 NotificationCompat.Builder builder;
 Context ctx;
 @Override
 public void onReceive(Context context, Intent intent) {
 GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
 ctx = context;
 WakeLocker.acquire(ctx);
 String messageType = gcm.getMessageType(intent);
 if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
 sendNotification("Send error: " + intent.getExtras().toString());
 } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
 sendNotification("Deleted messages on server: " +
 intent.getExtras().toString());
 } else {
 sendNotification("Received: " + intent.getExtras().toString());
 }
 setResultCode(Activity.RESULT_OK);
 WakeLocker.release();
 }
}

И для wakelocker я написал класс, вот он,

WakeLocker.java
import android.content.Context;
import android.os.PowerManager;
public abstract class WakeLocker {
 private static PowerManager.WakeLock wakeLock;
 public static void acquire(Context context) {
 if (wakeLock != null) wakeLock.release();
 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
 wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
 PowerManager.ACQUIRE_CAUSES_WAKEUP |
 PowerManager.ON_AFTER_RELEASE, "WakeLock");
 wakeLock.acquire();
 }
 public static void release() {
 if (wakeLock != null) wakeLock.release(); wakeLock = null;
 }
}

Попробуйте это, и если он не работает, пожалуйста, помогите!!!!


У меня была такая же проблема в последнее время, и я обнаружил, что это ошибка имени пакета в разрешениях. нужно точно следовать этому руководству, указав название своего основного пакета, что пример google поддается конфуцианству.

Добавьте в свой манифест приложения следующее:

The com.google.android.c2dm.permission.RECEIVE
The android.permission.INTERNET
The android.permission.GET_ACCOUNTS
The android.permission.WAKE_LOCK
An applicationPackage + ".permission.C2D_MESSAGE"

И В имени фильтра:

A receiver for com.google.android.c2dm.intent.RECEIVE

licensed under cc by-sa 3.0 with attribution.