Android Google Cloud Messaging GCM usando PHP Tutorial

Android Google Cloud Messaging GCM usando PHP Tutorial

En este tutorial, aprenderá cómo implementar Google Cloud Messaging GCM en su aplicación de Android. Google Cloud Messaging GCM es un servicio gratuito que ayuda a los desarrolladores a enviar notificaciones a su aplicación de Android. GCM es un servicio que maneja todos los aspectos de la cola de mensajes y la entrega al dispositivo Android de destino. Crearemos un servicio de cliente que le permita registrar su dispositivo Android en el servidor GCM. El servidor GCM generará una identificación de registro y la devolverá a su dispositivo Android y, al usar la identificación de registro en nuestro servidor web PHP, permitirá que se envíen mensajes de notificación. Vamos a empezar…

Mensajería en la nube de Google

Vaya a  la consola de API de Google  y haga clic en Crear proyecto .

apiproyecto

Encienda Google Cloud Messaging para Android .

GCMon

Vaya a Acceso API en el menú de la barra lateral y haga clic en Crear nueva clave de servidor.

clave del servidor

Haga clic en el botón Crear para continuar.

Configuración del servidor de creación de la API de Google de GCM

Anote su clave API  para aplicaciones de servidor (con bloqueo de IP) que se muestra en la siguiente captura de pantalla. Esta clave de API se utilizará al enviar solicitudes al servidor de GCM.

Clave API

Vaya a  Resumen  en el menú de la barra lateral y anote  su número de proyecto . Esta será su ID DE REMITENTE en GCM.

Número de proyecto de la API de Google de GCM

Instalar la biblioteca de mensajería en la nube de Google para Android

Abra Eclipse y haga clic en Android SDK Manager

Abra el Administrador de SDK de Android

Busque Google Cloud Messaging para la biblioteca de Android y haga clic en Instalar.

Instalar la biblioteca GCM 

Localice la carpeta de la biblioteca GCM de Android descargada .

Carpeta de la biblioteca de Android SDK GCM

Copie el archivo gcm.jar en la carpeta de la biblioteca de su proyecto libs

Copiar tarro de GCM

Crear un servicio CLIENTE

Cree un nuevo proyecto en Eclipse  File  >  New  >  Android Application Project. Complete los detalles y nombre su proyecto GCMTutorial .

Nombre de la aplicación:  GCMTutorial

Nombre del proyecto:  GCMTutorial

Nombre del paquete:  com.androidbegin.gcmtutorial

Luego nombre su actividad GCMMainActivity.java  y pegue el siguiente código.

GCMMainActivity .java

paquete com.androidbegin.gcmtutorial;

importar com.google.android.gcm.GCMRegistrar;

importar android.os.Bundle;
importar android.app.Actividad;
importar android.util.Log;
importar android.view.View;
importar android.widget.Button;

public class GCMMainActivity extiende Actividad {

	String TAG = "Tutorial de GCM::Actividad";

	@Anular
	Vacío protegido onCreate (Paquete de estado de instancia guardado) {
		super.onCreate(estadoDeInstanciaGuardado);
		setContentView(R.diseño.actividad_principal);
		GCMRegistrar.checkDevice(este);
		GCMRegistrar.checkManifest(esto);

		// Botón Registrar dispositivo
		Botón regbtn = (Botón) findViewById(R.id.register);

		regbtn.setOnClickListener(nueva Vista.OnClickListener() {
			@Anular
			public void onClick(Ver v) {
				Log.i(TAG, "Registrando dispositivo");
				// Recuperar la ID del remitente de GCMIntentService.java
				// El ID del remitente se registrará en GCMRegistrar
				GCMRegistrar.registrar(GCMMainActivity.this,
						GCMIntentService.SENDER_ID);
			}
		});
	}
}

En esta actividad, hemos creado un botón y, al hacer clic en el botón, se enviará la ID DEL REMITENTE al  servidor GCM .

A continuación, cree un diseño gráfico XML para su MainActivity. Vaya a  res  >  diseño  > Haga clic con el botón derecho en  diseño  >  Nuevo  >  Archivo XML de Android
Asigne un nombre a su nuevo archivo XML  activity_main.xml  y pegue el siguiente código.

actividad_principal .xml

<RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="match_parent"
    android_layout_height="match_parent" >

    <Botón
        android_id="@+id/registrar"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_centerInParent="verdadero"
        android_text="@string/regbutton" />

</RelativeLayout>

Producción:
Diseño XML de GCMMainActivity

A continuación, cree una clase GCMIntentService. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  GCMIntentService .java. Seleccione su paquete llamado  com.androidbegin. gcmtutorial  y haga clic en  Finalizar .

Abra su  GCMIntentService .java  y pegue el siguiente código.

GCMIntentService .java

paquete com.androidbegin.gcmtutorial;

importar java.util.Timer;
importar java.util.TimerTask;

importar android.app.Notificación;
importar android.app.NotificationManager;
importar android.app.PendingIntent;
importar android.content.Context;
importar android.content.Intent;
importar android.os.PowerManager;
importar android.util.Log;

importar com.google.android.gcm.GCMBaseIntentService;

clase pública GCMIntentService extiende GCMBaseIntentService {

	ETIQUETA de cadena final estática privada = "Tutorial de GCM::Servicio";

	// Usa tu ID DE PROYECTO de la API de Google en SENDER_ID
	Cadena final estática pública SENDER_ID = "394127269050";

	GCMIntentService público () {
		super(SENDER_ID);
	}

	@Anular
	Vacío protegido en registrado (contexto de contexto, cadena de identificación de registro) {

		Log.i(TAG, "enRegistrado: ID de registro=" + ID de registro);
	}

	@Anular
	Vacío protegido en No registrado (contexto de contexto, cadena de identificación de registro) {

		Log.i(TAG, "onNoregistrado: ID de registro=" + ID de registro);
	}

	@Anular
	Vacío protegido en el mensaje (contexto de contexto, datos de intención) {
		Mensaje de cadena;
		// Mensaje del servidor PHP
		mensaje = datos.getStringExtra("mensaje");
		// Abre una nueva actividad llamada GCMMessageView
		Intención intención = nueva intención (esto, GCMMessageView.class);
		// Pasar datos a la nueva actividad
		intent.putExtra("mensaje", mensaje);
		// Inicia la actividad al hacer clic en la notificación
		PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
				PendingIntent.FLAG_UPDATE_CURRENT);
		// Crear la notificación con un generador de notificaciones
		Notificación de notificación = new Notification.Builder (esto)
				.setSmallIcon(R.dibujable.ic_launcher)
				.setWhen(System.currentTimeMillis())
				.setContentTitle("Tutorial de GCM de Android")
				.setContentText(mensaje).setContentIntent(pIntent)
				.obtener la notificación();
		// Eliminar la notificación al hacer clic
		notificación.flags |= Notificación.FLAG_AUTO_CANCEL;

		Administrador de NotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		manager.notify(R.string.app_name, notificación);

		{
			// Despierta el dispositivo Android cuando se recibe la notificación
			PowerManager pm = (PowerManager) contexto
					.getSystemService(Contexto.POWER_SERVICE);
			PowerManager.WakeLock final mWakelock = pm.newWakeLock(
					PowerManager.FULL_WAKE_LOCK
							| PowerManager.ACQUIRE_CAUSES_WAKEUP, "GCM_PUSH");
			mWakelock.adquire();

			// Temporizador antes de poner el dispositivo Android en modo de suspensión.
			Temporizador temporizador = nuevo temporizador ();
			Tarea TimerTask = new TimerTask() {
				ejecución de vacío público () {
					mWakelock.release();
				}
			};
			timer.schedule(tarea, 5000);
		}

	}

	@Anular
	onError vacío protegido (Contexto arg0, Cadena errorId) {

		Log.e(TAG, "onError: errorId=" + errorId);
	}

}

En esta actividad, mostraremos el mensaje recibido en una notificación y, al hacer clic en la notificación, se pasará el mensaje de notificación a una nueva actividad. Uso de PowerManager para activar el dispositivo cuando se recibe una notificación. Inserte su ID de proyecto  en la  cadena de ID de REMITENTE .

A continuación, cree una actividad para mostrar el mensaje de notificación. Vaya a  Archivo  >  Nuevo  >  Clase  y asígnele el nombre  GCMMessageView .java. Seleccione su paquete llamado  com.androidbegin. gcmtutorial  y haga clic en  Finalizar .

Abra su  GCMMessageView .java  y pegue el siguiente código.

GCMMessageView .java

paquete com.androidbegin.gcmtutorial;

importar android.app.Actividad;
importar android.content.Intent;
importar android.os.Bundle;
importar android.widget.TextView;

public class GCMMessageView extiende Actividad {
	Mensaje de cadena;
	TextView txtmsg;

	@Anular
	public void onCreate (Paquete guardadoInstanceState) {
		super.onCreate(estadoDeInstanciaGuardado);
		setContentView(R.layout.messageview);

		// Recuperar los datos de GCMIntentService.java
		Intención i = getIntent();

		mensaje = i.getStringExtra("mensaje");

		// Localiza la vista de texto
		txtmsg = (TextView) findViewById(R.id.message);

		// Establecer los datos en TextView
		txtmsg.setText(mensaje);
	}
}

En esta actividad, usamos una intención para recuperar los datos de la clase GCMIntentService y configurarlos en TextView .

A continuación, cree un diseño gráfico XML para GCMMessageView. Vaya a  res  >  diseño  > Haga clic con el botón derecho en  diseño  >  Nuevo  >  Archivo XML de Android
Asigne un nombre a su nuevo archivo XML  messageview.xml  y pegue el siguiente código.

vista de mensajes .xml

<?versión xml="1.0" codificación="UTF-8"?>
<RelativeLayout xmlns_android="http://schemas.android.com/apk/res/android"
    xmlns_herramientas="http://esquemas.android.com/herramientas"
    android_layout_width="fill_parent"
    android_layout_height="fill_parent" >

    <Vista de texto
        android_id="@+id/msglbl"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_text="@cadena/msglbl" />

    <Vista de texto
        android_id="@+id/mensaje"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_toRightOf="@+id/msglbl" />

</RelativeLayout>

Producción:

Diseño XML de GCMMessageView

A continuación, cambie el nombre y los textos de la aplicación. Abra su  strings.xml  en su carpeta  res > valores  y pegue el siguiente código.

cadenas.xml

<?versión xml="1.0" codificación="utf-8"?>
<recursos>

    <string name="app_name">Tutorial de GCM</string>
    <string name="hello_world">¡Hola mundo!</string>
    <string name="menu_settings">Configuración</string>
    <string name="regbutton">Registrar dispositivo</string>
    <string name="msglbl">"Mensaje: "</string>

</recursos>

En su  AndroidManifest.xml , debemos declarar una actividad y permisos para permitir que la aplicación se comunique con GCM y nuestro servidor web PHP. Puede consultar las pautas de permisos aquí o simplemente seguir el código a continuación .
Abra su 
AndroidManifest.xml  y pegue el siguiente código.

AndroidManifest.xml 

<?versión xml="1.0" codificación="utf-8"?>
<manifiesto xmlns_android="http://schemas.android.com/apk/res/android"
    paquete="com.androidbegin.gcmtutorial"
    android_versionCode="1"
    android_versionName="1.0" >

    <usos-sdk
        android_minSdkVersion="11"
        android_targetSdkVersion="15" />

    <permiso android_name="com.androidbegin.gcmtutorial.permission.C2D_MESSAGE" android_protectionLevel="firma" />
    <usos-permiso android_name="com.androidbegin.gcmtutorial.permission.C2D_MESSAGE" />
    <usos-permiso android_name="com.google.android.c2dm.permission.RECEIVE" />
    <usos-permiso android_name="android.permission.WAKE_LOCK" />

    <aplicación
        android_allowBackup="falso"
        android_icono="@dibujable/ic_launcher"
        android_etiqueta="@cadena/nombre_aplicación" >
        <actividad
            android_name=".GCMMainActivity"
            android_launchMode="singleTask" >
            <intent-filter>
                <acción android_name="android.intent.action.MAIN" />

                <categoría android_name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </actividad>
        <actividad android_name=".GCMMessageView" >
        </actividad>

        <servicio android_name=".GCMIntentService" />

        <receptor
            android_name="com.google.android.gcm.GCMBroadcastReceiver"
            android_permiso="com.google.android.c2dm.permiso.ENVIAR" >
            <intent-filter>
                <acción android_name="com.google.android.c2dm.intent.RECEIVE" />
                <acción android_name="com.google.android.c2dm.intent.REGISTRO" />

                <categoría android_name="com.androidbegin.gcmtutorial" />
            </intent-filter>
        </receptor>
    </aplicación>

</manifiesto>

Producción:

Captura de pantalla del cliente de GCM

 

Cree un servidor PHP simple para comunicarse con GCM.

Hemos preparado un servidor PHP de muestra. Enlace:  https://www.androidbegin.com/tutorial/gcm.html

Producción:

Captura de pantalla del lado del servidor GCM

Para alojar su propio archivo de servidor, cargue ambos  códigos fuente PHP del lado del servidor   en una carpeta en la raíz de su servidor, ejecute gcm.html .

Código fuente PHP del lado del servidor:

[etiqueta wpfilebase = ID de archivo = 41 tpl = botón de descarga /]

gcm.html

<html>

<cabeza>
<title>AndroidBegin - Tutorial de GCM de Android</title>
<enlace rel="icono" tipo="imagen/png" href="https://www.androidbegin.com/wp-content/uploads/2013/04/favicon1.png"/>
</cabeza>

<cuerpo>

<a href="http://www.AndroidBegin.com" target="_blank">
<img src="https://www.androidbegin.com/wp-content/uploads/2013/04/Web-Logo.png" alt="AndroidBegin.com"></br></a></br >

<forma acción="gcm_engine.php" método="publicación">
Clave API de Google (con bloqueo de IP): <INPUT size=70% TYPE="Text" VALUE="" NAME="apiKey"></br>
Obtenga su clave API de Google: <a href="https://code.google.com/apis/console/" target="_blank">API de Google</a></br></br>
<img src="https://www.androidbegin.com/wp-content/uploads/2013/05/Google-API-Key.png" alt="Clave de API de Google" ></br></br>

ID de registro del dispositivo: <INPUT size=70% TYPE = "Text" VALUE="" NAME = "registrationIDs"></br></br>
Toque el botón Registrar en su aplicación de tutorial de GCM y localice el ID de registro del dispositivo en LogCat</br>
<img src="https://www.androidbegin.com/wp-content/uploads/2013/05/Device-Registration-ID.png" alt="ID de registro del dispositivo" ></br></br>

Mensaje de notificación: <INPUT size=70% TYPE = "Text" VALUE="" NAME = "message"></br></br>
<tipo de entrada="enviar" valor="Enviar notificación"/>
</formulario>

</cuerpo>
</html>

gcm_engine.php

<?php
// Mensaje a enviar
$mensaje = $_POST['mensaje'];

// Establecer variables POST
$url = 'https://android.googleapis.com/gcm/send';

$campos = matriz(
                'identificadores_de_registro' => matriz($_POST['identificadores_de_registro']),
                'datos' => matriz( "mensaje" => $mensaje),
                );

$encabezados = matriz(
                    'Autorización: clave=' . $_POST['clave de API'],
                    'Tipo de contenido: aplicación/json'
                );

// Abrir conexión
$ch = curl_init();

// Establecer la url, número de variables POST, datos POST
curl_setopt( $ch, CURLOPT_URL, $url );

curl_setopt( $ch, CURLOPT_POST, verdadero );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $encabezados);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $campos ) );

// Ejecutar publicación
$resultado = curl_exec($ch);

// Conexión cercana
curl_close($ch);

echo $resultado;

?>

ID de registro del dispositivo

Para recuperar su ID de registro de dispositivo , ejecute su proyecto en Eclipse en un dispositivo AVD o Android.

Toque el botón Registrar dispositivo

Toque el botón Registrar dispositivo

Abra su LogCat , escriba » onRegistrado » en el cuadro de búsqueda.

Id. de registro del dispositivo Eclipse LogCat

Su ID de registro de dispositivo debe ser algo como esto:

APA91bFQCD9Ndd8uVggMhj1usfeWsKIfGyBUWMprpZLGciWrMjS-77bIY24IMQNeEHzjidCcddnDxqYo-UEV03xw6ySmtIgQyzTqhSxhPGAi1maf6KDMAQGuUWc6L5Khze8YK9YrL9I_WD1gl408ZAS_9Thr

Producción:

Captura de pantalla del tutorial de Android GCM

Captura de pantalla del tutorial de Android GCM

Código fuente

[purchase_link id=”7926″ text=”Comprar para descargar el código fuente” style=”button” color=”green”]