Afficher le mémo de PUSH sur l'appareil Android et la notification sur la barre d'état à l'aide de l'API Google
Les préparatifs pour la notification PUSH sur Android sont décrits dans http://dev.classmethod.jp/smartphone/android/gcm/. .. C'était vraiment utile.
À partir de là, les modifications et les ajouts à partir du lien ci-dessus.
La procédure dans la Google Developers Console a légèrement changé, je vais donc l'expliquer.
Tout d'abord, accédez à https://console.developers.google.com/project et sélectionnez un projet existant ou "CRÉER UN PROJET".
Créez ou sélectionnez un projet pour ouvrir la page du projet. Notez le «numéro de projet» en haut de la page. Ensuite, activez l'état de "Google Cloud Messaging pour Android" dans "API et auth"> "API" dans le menu de gauche. Le document officiel est ici.
Ensuite, dans "API et authentification"> "Identifiants", sélectionnez "CRÉER UNE NOUVELLE CLÉ" dans "Accès API public" pour obtenir une nouvelle clé API. Dans la boîte de dialogue qui s'ouvre, sélectionnez "Clé serveur" et saisissez 0.0.0.0 comme adresse IP. Changez ici si nécessaire. 0.0.0.0 est parfait pour les tests. Peut-être.
GcmBroadcastReceiver.java utilisera celui lié ci-dessus tel quel. Réécrivez ensuite GcmIntentService.java pour notification.
GcmIntentService.java
public class GcmIntentService extends IntentService {
private static final String TAG = GcmIntentService.class.getSimpleName();
private Notification notification;
private NotificationManager nm;
public GcmIntentService() {
super("GcmIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.v(TAG, "onHandleIntent");
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)) {
Log.d(TAG, "messageType: " + messageType + ",body:" + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
Log.d(TAG,"messageType: " + messageType + ",body:" + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
Log.d(TAG,"messageType: " + messageType + ",body:" + extras.toString());
}
}
//Jusqu'ici http://dev.classmethod.jp/smartphone/android/gcm/Presque le même que
//extras contient des données du serveur
//Ici, tout est stocké sous forme de chaîne de caractères
Log.v(TAG, extras.toString());
int userId = Integer.parseInt(extras.getString("user_id"));
String text = extras.getString("text");
//Rendre MainActivity visible lorsque vous ouvrez une notification
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
i.setType("notification");
i.putExtra("user_id", userId);
i.putExtra("text", text);
//Si le 4ème argument est défini sur 0, seuls les extras de l'intention ne seront pas mis à jour et le texte de notification sera différent, mais les extras seront les mêmes.
//Dans le cas où vous ne pouvez obtenir la même valeur que lorsque vous obtenez des extras dans MainActivity of Intent destination
PendingIntent pi = PendingIntent.getActivity(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder notificationBuilder =
new Notification.Builder(getApplicationContext())
.setContentIntent(pi)
.setSmallIcon(R.drawable.icon_small)
.setTicker("J'ai une notification") //Texte affiché dans la barre d'état lorsqu'une notification arrive
.setContentTitle("Titre de la notification") //Le titre qui apparaît lorsque vous ouvrez la barre de notification
.setContentText("Texte de notification") //Texte affiché sous le titre
.setWhen(System.currentTimeMillis()); //Quand la notification est-elle affichée?
long[] vibrate_ptn = {0, 100, 300, 1000}; //Modèle de vibration (approprié)
notification = notificationBuilder.build();
notification.vibrate = vibrate_ptn;
notification.defaults |= Notification.DEFAULT_LIGHTS; //Définir le modèle de clignotement par défaut
notification.flags = Notification.FLAG_ONGOING_EVENT;
//Obtenir une instance de NotificationManager
nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(R.string.app_name, notification); //Notifier la notification définie
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
nm.cancel(R.string.app_name);
}
}
Ensuite, c'est l'activité principale qui démarre en tant qu'opération lorsque vous appuyez sur la notification. Le lien ci-dessus est très bien, mais ajoutez le code suivant à ʻonCreate`.
MainActivity.java
//relation d'affichage des notifications
Intent intent = getIntent();
String intentType = intent.getType();
if (intentType != null && intentType.equals("notification")) {
Log.v(TAG + " extras", intent.getExtras().toString());
//GcmIntentService des extras.Extraire les données saisies en java
int user_id = intent.getIntExtra("user_id", 0);
String text = intent.getStringExtra("text");
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//Afficher la boîte de dialogue
Toast.makeText(this, text, Toast.LENGTH_LONG);
}
Notez le registrationId affiché dans Log cat par registerInBackground ()
.
Si vous l'implémentez en tant qu'application, transmettez cet ID au serveur et enregistrez-le.
Depuis python, utilisez requests
pour envoyer des requêtes à Google.
api.py
import requests
import json
def push_notificate(user_id, text):
'''Si une erreur survient, un message d'erreur sera entré dans r
Appelez ceci pour recevoir une notification sur Android
'''
gcm_url = 'https://android.googleapis.com/gcm/send'
#RegistrationId et clé API indiqués ci-dessus
regid = REGID
key = "key=" + APIKEY
headers = {'content-type': 'application/json', 'Authorization': key}
#Les données à transmettre sont appropriées.
#Faites correspondre la clé dict avec la clé extras Android
params = json.dumps(\
{'registration_ids': [regid], \
'data': {'id': user_id, 'text': text}})
r = requests.post(gcm_url, data=params, headers=headers)
print r.text
return
Pour effacer l'authentification de base avec requests
, passez ʻauth = (nom d'utilisateur, mot de passe)` comme argument, mais cette fois, passez-le dans les en-têtes.
Je pense que ça va.
Recommended Posts