Notificaciones push en la plataforma Android

12 minutos de lectura

Notificaciones push en la plataforma Android
Vinod

Estoy buscando escribir una aplicación que reciba alertas enviadas desde un servidor. Encontré un par de métodos para hacer esto.

  1. SMS: intercepte los SMS entrantes e inicie una extracción desde el servidor
  2. Sondear el servidor periódicamente

Cada uno tiene sus propias limitaciones. SMS: no hay garantía sobre la hora de llegada. La encuesta puede agotar la batería.

¿Tiene una sugerencia mejor, por favor? Muchas gracias.

  • También puede ver la presentación de Google I/O 2010 sobre notificaciones push desarrollador.android.com/videos/index.html#v=PLM4LajwDVc

    – Vokilam

    2 de febrero de 2011 a las 8:52

  • Creo que puedes ver esta publicación: stackoverflow.com/questions/17629942/… Con Worklight puedes recibir notificaciones a través de diferentes canales, incluido GCM.

    – Neeraj Krishna

    15 de enero de 2014 a las 8:30

  • La presentación de Google I/O 2010 está disponible en youtube.com/watch?v=PLM4LajwDVc

    – elcuco

    16 de marzo de 2014 a las 15:21

  • “La encuesta puede agotar la batería”. Puede programar la encuesta con AlarmManager, para que la batería no se agote demasiado. Es una solución simple y gratuita (no es necesario pagar, como con GCM).

    – Profundo desprecio

    29 de abril de 2015 a las 11:39

  • tengo el mismo problema stackoverflow.com/questions/35812304/…

    – alberto

    5 de marzo de 2016 a las 9:30

1646761517 82 Notificaciones push en la plataforma Android
BoD

La respuesta oficial de Google es la Marco de mensajería de la nube al dispositivo de Android (obsoleto) Mensajería en la nube de Google(obsoleto) Mensajería en la nube de Firebase

Funcionará en Android >= 2.2 (en teléfonos que tengan Play Store).

  • está en versión beta ahora mismo, pero puedes registrarte con la esperanza de que se active.

    – soporte

    6 de octubre de 2010 a las 19:08

  • Por lo general, puede activarse muy rápidamente y se está utilizando para cosas como GMail, por lo que se sabe que funciona en producción. Desafortunadamente, falta su código de muestra para comunicarse con el aspecto del lado del servidor de C2DM. He escrito un tutorial para ese aspecto aquí blog.boxedice.com/2010/10/07/…

    – David Mytton

    7 oct 2010 a las 11:14

  • El problema es que necesita una cuenta de Google para sus usuarios: lo cual, creo, es una limitación.

    – café

    17 de abril de 2012 a las 12:13

  • Tenga en cuenta que Android Cloud to Device Messaging Framework ha quedado obsoleto. El nuevo marco se llama Google Cloud Messaging y se puede encontrar aquí: desarrollador.android.com/guide/google/gcm/index.html

    –Ryan Berger

    9 de julio de 2012 a las 1:04

  • El 10 de abril de 2018, Google desaprobó GCM. Las API de servidor y cliente de GCM se eliminaron el 29 de mayo de 2019. Migre las aplicaciones de GCM a Firebase Cloud Messaging (FCM), que hereda la infraestructura GCM confiable y escalable, además de muchas características nuevas. Consulte la guía de migración para obtener más información.

    – paiego

    13 de abril de 2020 a las 16:26

Notificaciones push en la plataforma Android
dalelane

(publicación cruzada de una respuesta que di a una pregunta similar: ¿Android admite notificaciones automáticas casi en tiempo real? )

Recientemente comencé a jugar con MQTT http://mqtt.org para Android como una forma de hacer este tipo de cosas (es decir, notificación automática que no es SMS sino datos, entrega de mensajes casi inmediata, no sondeo, etc.)

Tengo una publicación de blog con información general sobre esto en caso de que sea útil.

http://dalelane.co.uk/blog/?p=938

(Nota: MQTT es una tecnología de IBM y debo señalar que trabajo para IBM).

  • Hola Dale, leí la publicación de tu blog sobre MQTT y definitivamente parece cumplir con los requisitos para una notificación casi instantánea en los móviles. Pero no he podido encontrar ninguna información sobre cómo lo hace realmente. ¿Mantiene un enchufe abierto en todo momento? ¿Cómo notifica al servidor si su dirección IP ha cambiado? Le agradecería si pudiera arrojar algo de luz sobre esto. Saludos Naren

    – Narén

    5 de noviembre de 2009 a las 6:14

  • Mantiene una conexión abierta. En una publicación de seguimiento (dalelane.co.uk/blog/?p=1009) Hablé más sobre las implicaciones de mantener una conexión abierta, ¿viste eso? Si se interrumpe la conexión, tanto el servidor como el cliente pueden ser notificados. Entonces es una decisión de la capa de aplicación decidir cómo responder (por ejemplo, volver a conectar). Hay más información en los documentos a los que se hace referencia en la publicación (por ejemplo, IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 pdf en esa página y Javadoc en el zip de esa página)

    – dalelane

    5 de noviembre de 2009 a las 16:13

1646761518 743 Notificaciones push en la plataforma Android
Lalit

Mi comprensión/experiencia con las notificaciones push de Android son:

  1. C2DM MCG – Si su plataforma Android de destino es 2.2+, hágalo. Solo una captura, los usuarios de dispositivos deben estar siempre conectado con una cuenta de Google para recibir los mensajes.

  2. MQTT – Enfoque basado en Pub/Sub, necesita una conexión activa desde el dispositivo, puede agotar la batería si no se implementa con sensatez.

  3. Diácono – Puede que no sea bueno a largo plazo debido al limitado apoyo de la comunidad.

Editar: Añadido el 25 de noviembre de 2013

MCG -Google dice…

Para dispositivos anteriores a 3.0, esto requiere que los usuarios configuren su cuenta de Google en sus dispositivos móviles. Una cuenta de Google no es un requisito en dispositivos con Android 4.0.4 o superior.*

  • Si bien no se requiere una cuenta de Google para 4.0.4 o superior, parece requerir que tenga instalada la aplicación Google Play. Me pregunto cómo se instala eso sin tener una cuenta de Google.

    – Ene

    24 de febrero de 2014 a las 8:42

  • @Jan: la aplicación Google Play viene instalada con el dispositivo. El usuario no necesita instalar.

    – Dexter

    20 de diciembre de 2014 a las 6:20

  • @Dexter, no todos los dispositivos Android tienen Google Play instalado de forma predeterminada. La mayoría lo tiene instalado de forma predeterminada, especialmente los dispositivos que se compran a proveedores de teléfonos acreditados, pero es posible que los dispositivos que solo tienen el sistema operativo Android flasheado no siempre tengan Google Play. (Por ejemplo, muchos emuladores de Android, como los nuevos dispositivos Genymotion, no tienen Google Play de forma predeterminada).

    – Spencer D.

    24 de diciembre de 2015 a las 18:54

  • Entonces… ¿Es MQTT la mejor opción para dispositivos Android que no tienen Google Play instalado?

    – Yeung

    4 de octubre de 2017 a las 7:49

Marco de mensajería de la nube al dispositivo de Android

Importante: C2DM ha quedado obsoleto oficialmente a partir del 26 de junio de 2012. Esto significa que C2DM ha dejado de aceptar nuevos usuarios y solicitudes de cuota. No se agregarán nuevas características a C2DM. Sin embargo, las aplicaciones que usan C2DM seguirán funcionando. Se alienta a los desarrolladores de C2DM existentes a migrar a la nueva versión de C2DM, llamada Google Cloud Messaging para Android (GCM). Consulte el documento Migración de C2DM a GCM para obtener más información. Los desarrolladores deben usar GCM para nuevos desarrollos.

Por favor revise el siguiente enlace:

http://developer.android.com/guide/google/gcm/index.html

Notificaciones push en la plataforma Android
chicoveloz

Aquí he escrito algunos pasos para Cómo obtener ID de registro y notificación comenzando desde cero

  1. Crear/Registrar aplicación en Google Cloud
  2. Configurar Cloud SDK con desarrollo
  3. Configurar proyecto para GCM
  4. Obtener ID de registro del dispositivo
  5. Enviar notificaciones automáticas
  6. Recibir notificaciones automáticas

Puede encontrar un tutorial completo en el siguiente enlace URL

Introducción a las notificaciones push de Android: la última versión de Google Cloud Messaging (GCM): tutorial completo paso a paso

ingrese la descripción de la imagen aquí

Recorte de código para obtener el ID de registro (token de dispositivo para notificaciones automáticas).

Configurar proyecto para GCM


Actualizar el archivo AndroidManifest

Para habilitar GCM en nuestro proyecto, necesitamos agregar algunos permisos en nuestro archivo de manifiesto Vaya a AndroidManifest.xml y agregue el código a continuación Agregar permiso

<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="android.permission.VIBRATE" />

<uses-permission android:name=“.permission.RECEIVE" />
<uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

Agregar declaración de receptor de transmisión de GCM

agregue la declaración de GCM Broadcast Receiver en la etiqueta de su aplicación

<application
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="" />
            </intent-filter]]>

        </receiver]]>
     
<application/>

Agregar declaración de servicio de GCM

<application
     <service android:name=".GcmIntentService" />
<application/>

Obtener ID de registro (token de dispositivo para notificaciones automáticas)

Ahora ve a tu actividad de inicio/splash

Agregar constantes y variables de clase

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

Actualice los métodos OnCreate y OnResume

@Override
protected void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_launch);
     context = getApplicationContext();
         if (checkPlayServices()) 
     {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);

            if (regid.isEmpty())
            {
                registerInBackground();
            }
            else
            {
            Log.d(TAG, "No valid Google Play Services APK found.");
            }
      }
 }

@Override protected void onResume()
{
       super.onResume();       checkPlayServices();
}


# Implement GCM Required methods (Add below methods in LaunchActivity)

private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.d(TAG, "This device is not supported - Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
 }

private String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(PROPERTY_REG_ID, "");
   if (registrationId.isEmpty()) {
       Log.d(TAG, "Registration ID not found.");
       return "";
   }
   int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
   int currentVersion = getAppVersion(context);
   if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) 
{
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
                Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) 
{
     try 
     {
         PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
      } 
      catch (NameNotFoundException e) 
      {
            throw new RuntimeException("Could not get package name: " + e);
      }
}


private void registerInBackground() 
{     new AsyncTask() {
     Override
     protected Object doInBackground(Object... params) 
     {
          String msg = "";
          try 
          {
               if (gcm == null) 
               {
                        gcm = GoogleCloudMessaging.getInstance(context);
               }
               regid = gcm.register(SENDER_ID);               Log.d(TAG, "########################################");
               Log.d(TAG, "Current Device's Registration ID is: "+msg);     
          } 
          catch (IOException ex) 
          {
              msg = "Error :" + ex.getMessage();
          }
          return null;
     }     protected void onPostExecute(Object result) 
     { //to do here };
  }.execute(null, null, null);
}

Nota : almacene REGISTRATION_KEY, es importante para enviar un mensaje de PN a GCM, también tenga en cuenta el mío, esto será único para todos los dispositivos, al usar esto, solo GCM enviará una notificación automática.

Recibir notificaciones automáticas

Agregar clase de receptor de transmisión GCM

Como ya hemos declarado “GcmBroadcastReceiver.java” en nuestro archivo de Manifiesto, vamos a crear este código de clase de receptor de actualización de esta manera

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) 
    {        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
        Toast.makeText(context, “wow!! received new push notification", Toast.LENGTH_LONG).show();
    }
}

Agregar clase de servicio de GCM

Como ya hemos declarado “GcmBroadcastReceiver.java” en nuestro archivo de Manifiesto, vamos a crear este código de clase de receptor de actualización de esta manera

public class GcmIntentService extends IntentService
{     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
     super("GcmIntentService");     
     }     @Override
     protected void onHandleIntent(Intent intent) {
          Bundle extras = intent.getExtras();
          Log.d(TAG, "Notification Data Json :" + extras.getString("message"));

          GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
          String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
               .equals(messageType)) {
               sendNotification("Send error: " + extras.toString());
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
          sendNotification("Deleted messages on server: "
          + extras.toString());          // If it's a regular GCM message, do some work.
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
          .equals(messageType)) {
          // This loop represents the service doing some work.
          for (int i = 0; i < 5; i++) {
               Log.d(TAG," Working... " + (i + 1) + "/5 @ "
               + SystemClock.elapsedRealtime());               try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
               }
             }
             Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
             sendNotification(extras.getString("message"));
           }
        }        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
     }     // Put the message into a notification and post it.
     // This is just one simple example of what you might choose to do with
     // a GCM message.
     private void sendNotification(String msg) {          mNotificationManager = (NotificationManager) this
          .getSystemService(Context.NOTIFICATION_SERVICE);
          PendingIntent contentIntent = PendingIntent.getActivity(this, 0,          new Intent(this, LaunchActivity.class), 0);

          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(          this)
          .setSmallIcon(R.drawable.icon)
          .setContentTitle("Ocutag Snap")
          .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
          .setContentText(msg)
          .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);

          mBuilder.setContentIntent(contentIntent);          mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
     }
}

  • @Rohit, ¿has revisado el Enlace tener tutorial completo. También hágame saber lo que falta. Actualizaré la respuesta.

    – chicoveloz

    9 de diciembre de 2013 a las 7:29

1646761520 616 Notificaciones push en la plataforma Android
mtbkrdave

Hay un nuevo esfuerzo de código abierto para desarrollar una biblioteca Java para notificaciones automáticas en Android basada en el servidor web Meteor. Puedes comprobarlo en el blog del proyecto diácono, donde encontrarás enlaces a Meteor y al repositorio GitHub del proyecto. ¡Necesitamos desarrolladores, así que corra la voz!

  • @Rohit, ¿has revisado el Enlace tener tutorial completo. También hágame saber lo que falta. Actualizaré la respuesta.

    – chicoveloz

    9 de diciembre de 2013 a las 7:29

1646761521 14 Notificaciones push en la plataforma Android
pedro

Puedes usar Xtify (http://developer.xtify.com) – tienen un servicio web de notificaciones push que funciona con su SDK. es gratis y hasta ahora me ha funcionado muy bien.

  • Recibí una respuesta de su vicepresidente diciendo que no hay planes de cobrar por el servicio push. Es un SDK bastante sorprendente.

    – Crowe T. Robot

    23 de abril de 2010 a las 16:43


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad