2013-03-07 4 views
2

Я пытаюсь реализовать уведомления для своего приложения для Android, но я не получаю событие OnReceive, вызываемое MyBroadcastReciever.Приемник GCM Broadcast onReciever не называется

Вот мой манифеста Файл:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<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.google.android.c2dm.permission.RECEIVE" /> 

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

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.gcmtester.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="com.example.gcm.MyBroadcastReceiver" 
     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.gcm" /> 
     </intent-filter> 
    </receiver> 
    <service android:name="com.example.gcm.MyIntentService" /> 
</application> 
</manifest> 

Вот как я пытаюсь вызвать службу.

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
    registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
    registrationIntent.putExtra("sender", "MY_SENDER_ID"); 
    startService(registrationIntent); 

MyIntentService код также похож на тот, упоминается here. Но все же мой BroadcastReciever onRecieve метод не вызывается. В чем проблема, я что-то забываю?

Примечание:MyIntentService and BroadcastReciever классов находятся в отдельном пакете (com.example.gcm) от Main Activity пакета.

+0

любая конкретная причина, по которой не используется встроенная служба GCMIntentService, широковещательный приемник и GCMRegister (для регистрации устройства)? – drulabs

+0

нет причина. У меня был тот же пример, который работал несколько месяцев назад. Теперь я пытаюсь использовать тот же код для другого приложения, но он не работает, не знаю, что случилось. Если вы можете дать лучший рабочий пример, пожалуйста, было бы очень полезно – Mj1992

+0

вы создали другой проект ID (который используется как идентификатор отправителя в приложении) для нового приложения в консоли Google App? – Renjith

ответ

5

Вот как вы можете использовать службу облачных сообщений Google, используя библиотеку gcm.jar, которую предоставляет Google.

Перейти к диспетчеру SDK> Дополнительно и загрузить "Google Cloud Messaging for android". Вы можете найти файл jar в папке установки Android. Android> дополнительные услуги> google> gcm> gcm-client> dist> gcm.jar

Включите эту банку в свой проект.

Шаг 1: изменить ваш файл манифеста:

добавить этот приемник

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

добавить эту услугу:

<service android:name="com.your.package.GCMIntentService" /> 

Шаг 2: Создание GCMIntentService простирающуюся GCMBaseIntentService. Убедитесь, что вы поместите его в пакет вашего приложения по умолчанию, как это определено в атрибуте пакета манифесте в Manifest.xml

это, как он выглядит

public class GCMIntentService extends GCMBaseIntentService { 

@Override 
protected void onError(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 

} 

@Override 
protected void onMessage(Context arg0, Intent arg1) { 
    // TODO Auto-generated method stub 

} 

@Override 
protected void onRegistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 

} 

@Override 
protected void onUnregistered(Context arg0, String arg1) { 
    // TODO Auto-generated method stub 

} 

} 

Шаг 3: Регистрация устройства.

GCMRegistrar.checkDevice(this); 
GCMRegistrar.checkManifest(this); 
GCMRegistrar.register(this, SENDER_ID); 

это SENDER_ID является идентификатор отправителя (или идентификатор проекта я забыл) вы получили при регистрации на ГКМ. Вот и все. Теперь переопределите любой метод в GCMIntentService так, как вы хотите. Может быть, зарегистрировать некоторую информацию и посмотреть. У переопределенных методов есть очевидные имена. Как и onRegistered будет вызываться, когда регистрация устройства завершена, аргумент String является идентификатором регистрации GCM. для получения дополнительной информации нажмите here

надеюсь, что это поможет.

+0

вам не нужен GCMBroadcastReceiver ... Он встроен в gcm.jar. Приемник запускает GCMIntentService. – drulabs

+0

Я столкнулся с некоторыми ошибками, но каким-то образом смог их решить. Теперь проблема в том, что я не могу получить 'registerationID' для устройства. не могли бы вы рассказать мне, как я могу это получить. Я разместил 'log' в событии OnRegistered Event, посвященном makeService, чтобы получить regId, но отладчик там не доходит. – Mj1992

+0

@KKD что такое тег в манифесте? – Amy

1

Я предлагаю вам удалить текущие проекты и начать заново. Выполните шаги в этом tutorial тщательно для реализации.

Стандартная документация GCM довольно запутанна. Я следовал вышеупомянутому учебнику и успешно реализовал GCM.

Дополнительные примечания:

  1. GCM требуется эмулятор с API для Google.
  2. Для версий для Android версии 4.2, должна быть хотя бы одна зарегистрированная учетная запись google.
+0

Большое спасибо за вашу помощь. Я обязательно последую этому руководству, чтобы сделать вещи более ясными. – Mj1992

+0

Если вы найдете ответ полезным, не забудьте поместить свой голос. – Renjith

+0

Примечание: этот вопрос устарел –

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