Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Notificaciones push en la plataforma Android

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

  1. SMS – Interceptar los SMS entrantes e iniciar un pull desde el servidor
  2. Encuesta periódicamente al servidor

Cada uno tiene sus propias limitaciones. SMS- ninguna garantía en la hora de llegada. Encuesta puede drenar la batería.

¿Tiene una mejor sugerencia por favor? Muchas gracias.

  • Cómo obtener el contexto en un servicio de intención
  • Dónde encontrar el historial de fallos de Android
  • Aplicación del sistema Android 101
  • Altura mínima del botón de Android: 48dp = 9mm?
  • RecyclerView - ¿Cómo suavizar desplazamiento a la parte superior del elemento en una posición determinada?
  • ¿Cuál es la diferencia entre getWidth / Height () y getMeasuredWidth / Height () en Android SDK?
  • 18 Solutions collect form web for “Notificaciones push en la plataforma Android”

    La respuesta oficial de Google es la nube de Android a la mensajería de la mensajería (desaprobada) Google Cloud Messaging (obsoleta) Firebase Cloud Messaging

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

    ( Cross-posting de una respuesta que le di a una pregunta similar – ¿Soporta Android cerca de notificación push en tiempo real? )

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

    Tengo una entrada en el blog con información de fondo 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.)

    Marco de mensajería de Android Cloud to Device

    Importante: C2DM ha sido oficialmente obsoleto 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 funciones a C2DM. Sin embargo, las aplicaciones que utilizan C2DM seguirán funcionando. Se anima a los desarrolladores existentes de C2DM a migrar a la nueva versión de C2DM, llamada Google Cloud Messaging para Android (GCM). Consulte el documento de migración de C2DM a GCM para obtener más información. Los desarrolladores deben usar GCM para nuevos desarrollos.

    Por favor, compruebe el siguiente enlace:

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

    Aquí he escrito algunos pasos para cómo obtener RegID y notificación a partir de cero

    1. Crear / registrar la aplicación en Google Cloud
    2. Configuración de Cloud SDK con desarrollo
    3. Configurar el proyecto para GCM
    4. Obtener el ID de registro del dispositivo
    5. Enviar notificaciones push
    6. Recibir Notificaciones Push

    Puede encontrar el tutorial completo debajo del enlace URL

    Introducción a la Notificación Push de Android: el último mensaje de Google Cloud Messaging (GCM) – tutorial completo paso a paso

    Introduzca aquí la descripción de la imagen

    Codificar código para obtener el ID de registro (Token de dispositivo para notificación de emisión).

    Configurar el proyecto para GCM


    Actualizar el archivo AndroidManifest

    Para habilitar GCM en nuestro proyecto necesitamos agregar pocos permisos en nuestro archivo de manifiesto. Vaya a AndroidManifest.xml y agregue debajo de código. 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" /> 

    Añadir declaración de GCM Broadcast Receiver

    Agregue declaración GCM Broadcast Receiver en su etiqueta de 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/> 

    Añadir declaración de GCM Servie

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

    Obtener ID de registro (Token de dispositivo para notificación de empuje)

    Ahora vaya a su Actividad de Lanzamiento / 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; 

    Actualización de 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 : por favor, guarde REGISTRATION_KEY, es importante para el envío de mensaje PN a GCM también mantener en la mía esto será único para todos los dispositivos, utilizando este sólo GCM enviará Notificación Push.

    Recibir Notificaciones Push

    Añadir clase de receptor de difusión GCM

    Como ya hemos declarado "GcmBroadcastReceiver.java" en nuestro archivo de manifiesto, así que permite crear esta clase actualizar código de la clase del receptor 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 GCM

    Como ya hemos declarado "GcmBroadcastReceiver.java" en nuestro archivo de manifiesto, así que permite crear esta clase actualizar código de la clase del receptor 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()); } } 

    Mi comprensión / experiencia con la notificación push de Android son:

    1. C2DM GCM – Si su plataforma androide objetivo es 2.2 +, a continuación, vaya para él. Sólo una captura, los usuarios de dispositivos deben estar siempre conectados con una cuenta de Google para obtener los mensajes.

    2. MQTT – Pub / Sub enfoque basado, necesita una conexión activa desde el dispositivo, puede drenar la batería si no se implementa de manera sensata.

    3. Diácono – Puede no ser bueno en un largo plazo debido al apoyo limitado de la comunidad.

    Editar : Agregado el 25 de noviembre de 2013

    GCM – Google dice …

    Para dispositivos pre-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 los dispositivos que ejecutan Android 4.0.4 o superior. *

    Hay un nuevo esfuerzo de código abierto para desarrollar una biblioteca Java para notificaciones push en Android basado en el servidor web Meteor. Puedes verlo en el Blog del Proyecto Deacon , donde encontrarás enlaces a Meteor y el repositorio GitHub del proyecto. Necesitamos desarrolladores, así que por favor difunda la palabra!

    Puede utilizar Xtify ( http://developer.xtify.com ) – tienen un servicio de notificaciones push que funciona con su SDK. Es gratis y hasta ahora, ha funcionado muy bien para mí.

    o….

    3) Mantener una conexión con el servidor, enviar keep-alives cada pocos minutos, y el servidor puede empujar mensajes al instante. Así es como funciona Gmail, Google Talk, etc.

    Recomiendo usar GCM – Google Cloud Messaging para Android Es gratis, y para usos simples debe ser muy fácil.

    Sin embargo, se requiere para mantener un servidor de tercer lado para enviar las notificaciones en su nombre. Si desea evitar que haya algunas soluciones industriales muy buenas para el servicio de notificaciones push de Android:

    • Dirigible Urbano – libere hasta 1M notificaciones por mes, después se le cobra por cada 1000 notificaciones
    • PushApps – gratis para notificaciones de 1M por mes y notificaciones ilimitadas de 19,99 por mes
    • PushWoosh – gratuito para dispositivos 1M, los planes premium son desde 39 EURO

    Diclaimer – Trabajo en PushApps y también uso su producto en mis aplicaciones por más de un año.

    A partir del 18/05/2016 Firebase es la plataforma unificada de Google para desarrolladores móviles, incluidas las notificaciones push.

    Me temo que has encontrado los dos métodos posibles. Google fue, al menos inicialmente, va a implementar una api GChat que podría utilizar para una implementación push / pull. Lamentablemente, esa biblioteca fue cortada por Android 1.0.

    No sé si esto sigue siendo útil. Logré algo así con una biblioteca java en http://www.pushlets.com/

    Althoug hacerlo en un servicio no impedirá que android lo apague una matanza del hilo del oyente.

    Google C2DM se deprecia ahora, para eso, tiene que utilizar el nuevo servicio GCM (Google Cloud Messaging). Para documantation, vea http://developer.android.com/guide/google/gcm/gs.html

    C2DM: los usuarios de la aplicación deben tener la cuenta de Gmail.

    MQTT: cuando su conexión alcanzó a 1024, dejará de trabajar debido a que usó "select model" de linux.

    Hay un servicio gratuito de push y api para android, puedes probarlo: http://push-notification.org

    Método libre y fácil:

    Si su base de usuarios de destino no es grande (menos de un 1000) y desea un servicio gratuito para empezar, Airbop es el mejor y más conveniente.

    Sitio Web de Airbop Utiliza el servicio de mensajería de Google Cloud a través de su API y proporciona un buen rendimiento. Lo he usado para dos de mis proyectos y fue fácil implementarlo.

    Los servicios como Urbanship y son excelentes, pero proporcionan una pila de despliegue completa y no sólo las notificaciones push.

    Si sólo el servicio de empuje es su objetivo, Airbop funcionará bien.

    No he utilizado Pushwoosh , pero también es una gran opción. Permite empujar a 1.000.000 dispositivos de forma gratuita

    Yo sugeriría usar SMS y HTTP. Si el usuario no está registrado en enviar su teléfono un SMS para notificar que hay un mensaje en espera.

    Así es como funciona este servicio de Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

    Si implementa esto mismo, la parte difícil es eliminar los SMS entrantes sin que el usuario lo vea. O tal vez está bien si lo ven en su caso.

    Parece que esto funciona: Cómo eliminar SMS usando BroadCastReceiver – Android

    Sí, escribir código como este puede ser peligroso y potencialmente puede arruinar la vida de alguien porque su aplicación eliminó un SMS que no debería tener.

    Puedes utilizar Google Cloud Messaging o GCM , es gratuito y fácil de usar. También puede utilizar servidores de empuje de terceros como PushWoosh que le da más flexibilidad

    Hay muchos servidores de terceros como Urban Airship , Xtify, Mainline , … que permiten enviar no solo en Android, sino también en iOs, Windows Phone …

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.