Android GCM de base de la mise en œuvre
Mise à JOUR: j'ai corrigé les problèmes dans le code ci-dessous donc, cela fait une bonne base de travail exemple d'utilisation de GCM
Donc, je suis en train de mettre en œuvre Android GCM
dans mon application. Voici les pièces que j'ai ajouté pour le manifeste:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="20" />
<permission
android:name=".permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name=".permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
...
<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.badbob.app.gmctestapp" />
</intent-filter>
</receiver>
<service android:name=".GCMIntentService" />
J'ai ajouté le code suivant dans le onCreate de mon activité principale:
GCMRegistrar.checkDevice( this );
GCMRegistrar.checkManifest( this );
final String regId = GCMRegistrar.getRegistrationId( this );
if( regId.equals( "" ) ) {
GCMRegistrar.register( this, GCM_SENDER_ID );
}
else {
Log.v( LOG_TAG, "Already registered" );
}
J'ai également créé le GCMIntenetService
classe comme ceci:
public class GCMIntentService extends GCMBaseIntentService {
private static final String LOG_TAG = "GetAClue::GCMIntentService";
public GCMIntentService() {
super( GCM_SENDER_ID );
//TODO Auto-generated constructor stub
Log.i( LOG_TAG, "GCMIntentService constructor called" );
}
@Override
protected void onError( Context arg0, String errorId ) {
//TODO Auto-generated method stub
Log.i( LOG_TAG, "GCMIntentService onError called: " + errorId );
}
@Override
protected void onMessage( Context arg0, Intent intent ) {
//TODO Auto-generated method stub
Log.i( LOG_TAG, "GCMIntentService onMessage called" );
Log.i( LOG_TAG, "Message is: " + intent.getStringExtra( "message" ) );
}
@Override
protected void onRegistered( Context arg0, String registrationId ) {
//TODO Auto-generated method stub
Log.i( LOG_TAG, "GCMIntentService onRegistered called" );
Log.i( LOG_TAG, "Registration id is: " + registrationId );
}
@Override
protected void onUnregistered( Context arg0, String registrationId ) {
//TODO Auto-generated method stub
Log.i( LOG_TAG, "GCMIntentService onUnregistered called" );
Log.i( LOG_TAG, "Registration id is: " + registrationId );
}
}
Lorsque je l'exécute-je obtenir ce LogCat:
07-11 11:28:46.340: V/GCMRegistrar(27435): Registering receiver
07-11 11:28:46.370: D/GCMRegistrar(27435): resetting backoff for com.badbob.app.getacluebeta
07-11 11:28:46.380: V/GCMRegistrar(27435): Registering app com.badbob.app.getacluebeta of senders 128205395388
De ce que j'ai glanées à partir d'autres postes, je devrais obtenir un numéro d'enregistrement dans LogCat
mais je ne suis pas. Aussi onRegistered()
dans GCMIntentService
n'est jamais appelé. Donc, ce que je fais mal?
- Vous venez de vous inscrire pour GCM? Essayez à nouveau quelques heures plus tard. Google Api ont un temps de retard, votre ID de l'expéditeur ne s'active immédiatement.
- J'ai signé plus de 24 heures.
- Pouvez-vous montrer le code de votre GCMBroadcastReceiver et GCMRegistrar classes?
- Heu, je n'ai pas écrit ces classes. Ce que j'ai posté est tout le code que j'ai écrit. Je suis en manque de quelque chose?
- ceux qui sont de la bibliothèque de classes. Contrairement à C2DM, GCM est livré avec une bibliothèque d'aide.
- je vous remercie. En effet. Mais pourquoi ne Rooster242 ont enregistré le récepteur nommé "com.google.android.gcm.GCMBroadcastReceiver"? Il doit registe souhaité la diffusion de la classe de l'extension d'une BrodcastReceiver qui va déclencher l' ".GCMIntentService" de service.
- C'est ma compréhension que le GCM bibliothèque gère pour vous et c'est pourquoi la classe doit être nommé exactement GCMIntentService. N'est-ce pas exact?
- Où est
GCM_SENDER_ID
défini/affecté?
Vous devez vous connecter pour publier un commentaire.
c'est incorrect
Comme il est dit dans la documentation. vous devez déclarer un PUBLIC, AUCUN ARGUMENT constructeur de GCMIntentService. Sinon, le GCMIntentService ne peut pas être instanciée correctement en arrière-plan l'intention des services.
la senderID peut être codé en dur chaîne constante, car il ne sera plus possible de changer avec la nouvelle GCM.
Il est également très important que vous utilisez le bon senderID. 24 heures est assez long pour le vôtre pour être actif, donc si ma solution ci-dessus ne fonctionne pas, vous utilisez la mauvaise senderID. Tout le reste ressemble beaucoup.
La senderID est dans l'URL de votre navigateur web lorsque vous naviguez sur l'API de Google page d'accès. Cliquez sur la GCM, et un nombre à 12 chiffres seront présents dans le navigateur l'URL. C'est la bonne clé à utiliser. PAS votre clé API. Qui est utilisé sur l'Application côté serveur.
J'ai aussi eu ce bug Gênant, jusqu'à maintenant. Le Problème, c'est que j'ai déclaré la intentservice à l'intérieur d'un autre paquet... même si j'ai déclaré le nom dans le manifeste android et pas de classnotfound exception avait été mis en place... pas d'erreur a pu être trouvé... j'ai donc fait en sorte que le intentservice est dans le package racine.
Je pense que vous avez quelques problèmes dans le code.
Vous devriez faire l'enregistrement de votre propre récepteur de radiodiffusion dans le fichier manifeste et que le récepteur va déclencher l'
<service android:name=".GCMIntentService" />
.Par conséquent, vous devez faire quelque chose comme je l'écris ci-dessous.
Le récepteur doit être déclaré comme:
Votre récepteur de radiodiffusion qui va démarrer le service.
Je vous conseille de prendre un coup d'oeil à l'officiel de la GCM la documentation où vous pouvez trouver un bon exemple.
Et... n'oubliez pas d'activer le Google Cloud Messaging service dans les principales Api Google page de la Console.
Laissez-moi savoir si ça aide!
Voir ci-dessous un tutoriel pour GCM:-
http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/
Ici, j'ai écrit quelques étapes pour Obtenir l'Id d'enregistrement et de Notification à partir de zéro
Vous pouvez trouver tutoriel complet dans l'URL ci-dessous le lien
Capture Code pour obtenir l'Enregistrement de l'ID (Dispositif de Jeton pour le Push Notification).
Configurer le projet pour GCM
Mise à jour de fichier AndroidManifest
Pour activer la GCM, dans notre projet, nous avons besoin d'ajouter quelques permission dans notre fichier de manifeste
Aller à AndroidManifest.xml et d'ajouter le code ci-dessous
Ajouter La Permission
Ajouter GCM Récepteur de Radiodiffusion déclaration
ajouter GCM Récepteur de Radiodiffusion déclaration dans votre balise application
Ajouter GCM Servie déclaration
Obtenir l'Enregistrement de l'ID (Dispositif de Jeton pour le Push Notification)
Maintenant, Allez à votre Lancement/Splash Activité
Ajouter des Constantes et des Variables de Classe
Mise à jour OnCreate et OnResume méthodes
Note : stocker REGISTRATION_KEY, il est important pour l'envoi de PN Message à GCM
aussi garder la mienne ce sera unique pour tous les périphériques, à l'aide de cette seule GCM enverra une Notification Push.
Recevoir Des Notifications Push
Ajouter GCM Récepteur de Radiodiffusion de Classe
Comme nous l'avons déjà déclaré “GcmBroadcastReceiver.java” dans notre fichier de Manifeste, Donc permet de créer cette classe
mise à jour du récepteur de code de classe de cette façon
Ajouter GCM Classe de Service
Comme nous l'avons déjà déclaré “GcmBroadcastReceiver.java” dans notre fichier de Manifeste, Donc permet de créer cette classe
mise à jour du récepteur de code de classe de cette façon
Ne sais pas si c'est lié à votre problème spécifique, cependant, j'ai été rencontrent le même problème. Tout a été correctement configurée, aussi loin que je pouvais dire, mais le
onRegistered()
gestionnaire n'a jamais été appelée.J'ai eu le standard
onCreate()
,onStart()
etonDestroy()
méthodes de service dans le cadre de mon GCMIntentService classe. Une fois que je les ai retirées, le maître-chien a été appelé, comme prévu.Mon hypothèse est qu'en remplaçant ces méthodes, j'ai été en passant nécessaire de code d'initialisation.
Après la lecture de ClouDeveloper post, je l'ai enlevé
onCreate()
,onDestroy()
, et de l'autre onXXX() méthodes de rappel. Aussi, monGCMIntentService.onRegistered(Context, regId)
est appelée avec leregId
.Merci ClouDeveloper!
Vous aussi vous devez vous inscrire avec votre serveur d'applications dans le GCMBaseIntentService.onRegistered() de rappel. Sinon vous ne serez pas en mesure d'envoyer vos messages app.
Vous devriez vraiment checkout Google GCM démo client car il fournit un exemple de travail avec l'ensemble du code est correct. Nous avons aussi un exemple de travail sur github: airbop-client. Il fournit un peu plus complète de l'exemple donné qu'il a de travail des interactions avec un serveur d'application, ce qui est nécessaire pour un GCM activé app. Il fonctionne avec les AirBop serveurs (que j'ai contribué à créer) qui sont gratuits jusqu'à 1000 appareils.
Si vous n'obtenez pas de réponse de l'enregistrement, l'une des principale raison en est que votre fichier manifest n'est pas configuré correctement - en particulier de donner la "nom_du_package" (le package de votre application nom comme com.xxx.yyy) dans le
<permission>
et<intent filter>
correctement.