1

I'd like to implement push notifications in android ?

I prefer not to use an existing plugins

would someone give me an example of code on how to send a message

have been struggling since a week none of my tries have been successfull

This is my last try:

gcm.py

    import requests
import json


def send_gcm_message(api_key, regs_id, data, collapse_key=None):
    """
    Send a GCM message for one or more devices, using json data
    api_key: The API_KEY from your console (https://code.google.com/apis/console, locate Key for Server Apps in
        Google Cloud Messaging for Android)
    regs_id: A list with the devices which will be receiving a message
    data: The dict data which will be send
    collapse_key: A string to group messages, look at the documentation about it:
        http://developer.android.com/google/gcm/gcm.html#request
    """
    values = {
        'registration_ids': regs_id,
        'collapse_key': collapse_key,
        'data': data
    }

    values = json.dumps(values)

    headers = {
        'UserAgent': "GCM-Server",
        'Content-Type': 'application/json',
        'Authorization': 'key=' + api_key,
    }

    response = requests.post(url="https://android.googleapis.com/gcm/send",
                             data=values,
                             headers=headers)
    return response.content

views.py

import settings
from .gcm import send_gcm_message


@render_to("push/envoyer_message.html")
def send_message(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/client/login')
    else:
        if request.method == 'POST':
            form = MessageForm(request.POST)
            if form.is_valid():
                form.save()

                reg_id='APA91bFSIEHPOeT2I7ddCqnYtnJ-iAEQfCiR3HArUIz0t5lQUVfIOGhlEIUJCJLY7SWEdwiJCHedLNaSFi6oVqbnsci9-HmpBNiZAa86KD3349AIWMesweUqF2YbfpSBRot1tNLCITRFbYH9g5AO514s8Zzs4ABumA'
                msg='test'
                send = send_gcm_message(api_key = settings.GCM_APIKEY, regs_id=[reg_id], data={'msg': msg},collapse_key="message")

                messages.success(request, _(u'Formulaire envoyé avec succès.'))
                return HttpResponseRedirect(reverse("push-confirmation-envoi"))
        else:
            form = MessageForm()        
        return locals()

EDIT:

This is the error I get :

 Field "data" must be a JSON array: test www
Armance
  • 5,350
  • 14
  • 57
  • 80
  • If you got a success response, the server code is working. If you didn't get the notification, the problem is in your client app. – Eran Nov 28 '13 at 11:15
  • I tried another code (php) with the same client app and I received the notification so I dont think so – Armance Nov 28 '13 at 11:20
  • If one server works and the other doesn't, then either you didn't get a success response in the server that doesn't work, or you didn't send the message to the same application and device (make sure you used the same registration id and api key in both servers). – Eran Nov 28 '13 at 11:24
  • It's the same app and device (I only have one of each), I tried it again and did get the same response as above. What else could be wrong? – Armance Nov 28 '13 at 11:38
  • I did some edits to see if there is an error somewhere and found this `Field "data" must be a JSON array: test www` – Armance Nov 28 '13 at 11:58

1 Answers1

1

SOLVED

                regs_id = list()
                for device in devices_a :
                    regs_id.append(device.token_string)                    


                message = json.dumps(message)
                values = {
                    'registration_ids': regs_id,
                    'collapse_key': "message" ,
                    'data': {"message":str(msg.message)}
                }   

                headers = {
                    'UserAgent': "GCM-Server",
                    'Content-Type': 'application/json',
                    'Authorization': 'key=' + settings.GCM_APIKEY,
                }

                response = requests.post(url="https://android.googleapis.com/gcm/send",data=json.dumps(values), headers=headers)

                r = json.loads(response.content)
                msg.nbr_android_recieved = r["success"]
Armance
  • 5,350
  • 14
  • 57
  • 80