Je cherche à écrire une application qui reçoit des alertes poussées d'un serveur. J'ai trouvé quelques méthodes pour le faire.
Chacun a ses propres limites. SMS - pas de garantie sur l'heure d'arrivée. Poll peut vider la batterie.
Avez-vous une meilleure suggestion s'il vous plaît? Merci beaucoup.
La réponse officielle de Google est la Framework de messagerie Android Cloud to Device (obsolète)Google Cloud Messaging (obsolète) Messagerie Cloud Firebase
Cela fonctionnera sur Android> = 2.2 (sur les téléphones équipés du Play Store).
( publication croisée d'une réponse que j'ai donnée à une question similaire - _ Est-ce que Android prend en charge la notification Push en temps quasi réel?)
J'ai récemment commencé à jouer avec MQTT http://mqtt.org pour Android comme moyen de faire ce genre de chose (c'est-à-dire une notification Push qui n'est pas SMS mais axé sur les données, remise quasi immédiate des messages, non interrogation, etc.)
J'ai un article de blog avec des informations générales à ce sujet au cas où cela serait utile
http://dalelane.co.uk/blog/?p=938
(Remarque: MQTT est une technologie IBM et je dois préciser que je travaille pour IBM.)
Ma compréhension/expérience avec Android Notification push est la suivante:
C2DM GCM - Si votre plate-forme cible Android est une version 2.2+, alors allez-y. Juste une capture, les utilisateurs d'appareils doivent toujours être connectés à un compte Google pour recevoir les messages.
MQTT - Approche basée sur la publication/sous-traitance, nécessite une connexion active de l'appareil, peut épuiser la batterie si elle n'est pas correctement mise en œuvre.
Deacon - Peut ne pas être bon à long terme en raison du soutien limité de la communauté.
Modifier : Ajouté le 25 novembre 2013
GCM - Google dit ...
Pour les appareils antérieurs à la version 3.0, les utilisateurs doivent configurer leur compte Google sur leurs appareils mobiles. Un compte Google n'est pas obligatoire sur les appareils exécutant Android 4.0.4 ou une version ultérieure. *
Ici, j'ai écrit quelques étapes pour Comment obtenir un RegID et une notification en partant de zéro
Vous pouvez trouver le tutoriel complet ci-dessous lien URL
Code snip pour obtenir l'ID d'enregistrement (jeton de périphérique pour notification push).
Configurer le projet pour GCM
Pour activer GCM dans notre projet, nous devons ajouter quelques autorisations dans notre fichier manifeste. Accédez au fichier AndroidManifest.xml et ajoutez le code ci-dessous. Ajouter une autorisation
<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" />
Ajouter une déclaration GCM Broadcast Receiver
ajoutez la déclaration du récepteur de diffusion GCM dans votre balise d'application
<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/>
Ajouter une déclaration GCM Servie
<application
<service Android:name=".GcmIntentService" />
<application/>
Allez maintenant à votre activité Launch/Splash
Ajouter des constantes et des variables de classe
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;
Mettre à jour les méthodes OnCreate et 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);
}
Remarque : veuillez enregistrer REGISTRATION_KEY, il est important d'envoyer un message PN à GCM, mais conservez-le. Ce message sera unique pour tous les appareils, en utilisant ce seul GCM. enverra une notification push.
Ajouter une classe de récepteur de diffusion GCM
Comme nous avons déjà déclaré "GcmBroadcastReceiver.Java" dans notre fichier manifeste, créons de cette manière le code de classe du récepteur de mise à jour de classe.
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();
}
}
Ajouter une classe de service GCM
Comme nous avons déjà déclaré "GcmBroadcastReceiver.Java" dans notre fichier manifeste, créons de cette manière le code de classe du récepteur de mise à jour de classe.
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());
}
}
Cadre de messagerie Android Cloud to Device
Important: C2DM est officiellement obsolète depuis le 26 juin 2012. Cela signifie que C2DM a cessé d'accepter de nouveaux utilisateurs et de nouvelles demandes de quota. Aucune nouvelle fonctionnalité ne sera ajoutée à C2DM. Cependant, les applications utilisant C2DM continueront à fonctionner. Les développeurs C2DM existants sont invités à migrer vers la nouvelle version de C2DM, appelée Google Cloud Messaging pour Android (GCM). Consultez le document Migration C2DM vers GCM pour plus d'informations. Les développeurs doivent utiliser GCM pour les nouveaux développements.
Veuillez vérifier le lien suivant:
Un nouvel effort open-source consiste à développer une bibliothèque Java pour les notifications Push sur Android sur la base du serveur Web Meteor. Vous pouvez le vérifier sur le site blog du projet Deacon , où vous trouverez des liens vers Meteor et le référentiel GitHub du projet. Nous avons besoin de développeurs, alors s'il vous plaît, passez le mot!
Vous pouvez utiliser Xtify ( http://developer.xtify.com ) - ils ont un service Web de notifications Push qui fonctionne avec leur SDK. c'est gratuit et jusqu'à présent, ça a vraiment bien fonctionné pour moi.
ou....
) Conservez une connexion au serveur, envoyez des alertes persistantes toutes les quelques minutes et le serveur peut envoyer des messages instantanément. Voici comment fonctionnent Gmail, Google Talk, etc.
Depuis le 18/05/2016 Firebase est la plate-forme unifiée de Google pour les développeurs mobiles, y compris les notifications Push.
Je recommande d'utiliser GCM - Google Cloud Messaging pour Android C'est gratuit, et pour des utilisations simples, cela devrait être très facile.
Cependant, il est nécessaire de maintenir un serveur tiers pour envoyer les notifications en votre nom. Si vous voulez éviter les très bonnes solutions industrielles pour Android service de notifications push:
Diclaimer - Je travaille dans des PushApps et j'utilise également leur produit dans mes applications depuis plus d'un an maintenant.
J'ai bien peur que vous ayez trouvé les deux méthodes possibles. Au moins au début, Google allait implémenter une API GChat que vous pouvez utiliser pour une implémentation Push/Pull. Malheureusement, cette bibliothèque a été coupée par Android 1.0.
Je ne sais pas si cela est toujours utile. J'ai réalisé quelque chose comme ceci avec une bibliothèque Java à l'adresse http://www.pushlets.com/
Bien que le faire dans un service n'empêche pas Android de l'arrêter et de tuer le thread d'écoute.
Google C2DM est maintenant amorti. Pour cela, vous devez utiliser le nouveau service GCM (Google Cloud Messaging). Pour la documentation, voir http://developer.Android.com/guide/google/gcm/gs.html
Méthode simple et gratuite:
Si votre base d'utilisateurs cible n'est pas importante (moins de 1 000 personnes) et que vous souhaitez un service gratuit pour commencer, Airbop est le meilleur et le plus pratique.
Site Web Airbop Il utilise le service de messagerie Google Cloud via son API et offre de bonnes performances. Je l'ai utilisé pour deux de mes projets et sa mise en œuvre a été facile.
Des services tels que Urbanship sont excellents mais fournissent une pile de déploiement complète et pas seulement les notifications Push.
Si seul le service Push est votre cible, Airbop fonctionnera correctement.
Je n'ai pas utilisé Pushwoosh , mais c'est aussi un excellent choix. Il permet de pousser gratuitement 1 000 000 appareils
C2DM: vos utilisateurs de l'application doivent avoir le compte gmail.
MQTT: lorsque votre connexion atteindra 1024, il cessera de fonctionner car il utilise "select model" de linux.
Il existe un service Push gratuit et une API pour Android, vous pouvez l'essayer: http://Push-notification.org
Il y a beaucoup de serveurs tiers comme rban Airship , Xtify, Mainline , ... ce qui permet d'envoyer des messages non seulement sur Android, mais aussi sur iOs, Windows Phone ...
Je suggère d'utiliser à la fois SMS et HTTP. Si l'utilisateur n'est pas connecté, envoyez à son téléphone un SMS pour l'informer qu'un message est en attente.
Voici comment fonctionne ce service Ericsson Labs: https://labs.ericsson.com/apis/mobile-Java-Push/
Si vous l'implémentez vous-même, la partie délicate consiste à supprimer le SMS entrant sans que l'utilisateur le voie. Ou peut-être que ça va s'ils le voient dans votre cas.
On dirait que cela fonctionne: Suppression de SMS à l'aide de BroadCastReceiver - Android
Oui, écrire un code comme celui-ci peut être dangereux et vous pouvez potentiellement gâcher la vie de quelqu'un parce que votre application a supprimé un SMS qu'elle n'aurait pas dû.
Firebase Cloud Messaging (FCM) est la nouvelle version de GCM. FCM est une solution de messagerie multiplateforme qui vous permet d'envoyer des messages en toute sécurité et gratuitement. Hérite de l’infrastructure centrale de GCM pour diffuser des messages de manière fiable sur Android, iOS, Web (javascript), Unity et C++.
À compter du 10 avril 2018, Google a désapprouvé GCM. Les API client et serveur GCM sont obsolètes et seront supprimées le 11 avril 2019. Google recommande de migrer les applications GCM vers Firebase Cloud Messaging (FCM), qui hérite de l'infrastructure GCM fiable et évolutive.
Vous pouvez utiliser Pusher
C'est un service hébergé qui simplifie l'ajout de données et de fonctionnalités en temps réel aux applications Web et mobiles.
Pusher propose des bibliothèques à intégrer dans les principaux environnements d’exécution et les frameworks.
PHP, Ruby, Python, Java, .NET, Go and Node
sur le serveurJavaScript, Objective-C (iOS) and Java (Android)
sur le client.