Recibir notificación de análisis mediante el receptor de difusión personalizado
Estoy utilizando la notificación de análisis en mi aplicación. Estoy recibiendo una alerta de notificación usando GcmBroadcastReceiver. Pero estoy viendo mucha notificación de recibir a mi aplicación. Pensé en actualizar la notificación en la barra de estado por lo que utilizó receptor personalizado. Al recibir la notificación a través de GcmBroadcastReceiver, mi broadcastreceiver personalizado llamó. Así que en mi barra de estado que tiene tanto gcm y notificaciones personalizadas. Quiero notificación personalizada solamente. ¿Cómo resolver este problema?
Código manifiesto:
- ¿Cómo recuperar más de 1000 filas de Parse.com?
- Cómo subir un archivo de audio a Parse.com - Android
- Vaciar RecyclerView utilizando datos obtenidos de parse.com
- Android Parse - ParseQuery con condiciones de igualdad de lista para campo / columna
- Parse.com - Enviar duplicado después de reinstalar la aplicación
<receiver android:name="com.parse.ParseBroadcastReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver> <receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <!-- IMPORTANT: Change "com.parse.tutorials.pushnotifications" to match your app's package name. --> <category android:name="com.packagename" /> </intent-filter> </receiver> <receiver android:name="com.parse.ParsePushBroadcastReceiver" android:exported="false" > <intent-filter> <action android:name="com.parse.push.intent.RECEIVE" /> <action android:name="com.parse.push.intent.DELETE" /> <action android:name="com.parse.push.intent.OPEN" /> </intent-filter> </receiver> <receiver android:name="com.packagename.IncomingReceiver" android:enabled="true" android:exported="false" > <intent-filter> <action android:name="com.packagename.UPDATE_STATUS" /> </intent-filter> </receiver>
Clase de aplicación :
Parse.initialize(this, "app id", "client id");
Incomingreceiver clase:
public class IncomingReceiver extends BroadcastReceiver { private static final int NOTIFICATION_ID = 1; public static int numMessages = 0; @Override public void onReceive(Context context, Intent intent) { try { String action = intent.getAction(); JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data")); if (action.equalsIgnoreCase("com.packagename.UPDATE_STATUS")) { String title = "appname"; if (json.has("header")) title = json.getString("header"); generateNotification(context, title, json,contenttext); } } catch (JSONException e) { Log.d("jsonexc", "JSONException: " + e.getMessage()); } } private void generateNotification(Context context, String title, JSONObject json, String contenttext) { Intent intent = new Intent(context, NewActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0); NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.app_icon).setContentTitle(title).setContentText("contenttext").setNumber(++numMessages); mBuilder.setContentIntent(contentIntent); mNotifM.notify(NOTIFICATION_ID, mBuilder.build()); } }
- No se puede codificar un archivo de análisis no guardado, trabajando con ParseUser
- Notificación de empuje que no recibe android
- Pushes no recibidos después de que la aplicación esté cerrada
- Cómo cargar varias imágenes en ImageViews (parse.com)
- android parse dispositivo de notificación push registrado varias veces
- Parse Push - Cómo abrir automáticamente una actividad sin la acción del usuario al recibir un empujón en Android
- Cómo enviar la notificación push usando phonegap y analizar
- Cómo obtener todos los valores de columna de una sola fila en android parse.com
Reemplázalo
<receiver android:name="com.parse.ParsePushBroadcastReceiver" android:exported="false" > <intent-filter> <action android:name="com.parse.push.intent.RECEIVE" /> <action android:name="com.parse.push.intent.DELETE" /> <action android:name="com.parse.push.intent.OPEN" /> </intent-filter> </receiver>
para usted:
<receiver android:name=".MyReceiver" android:exported="false" > <intent-filter> <action android:name="com.parse.push.intent.RECEIVE" /> <action android:name="com.parse.push.intent.DELETE" /> <action android:name="com.parse.push.intent.OPEN" /> </intent-filter> </receiver>
Y crear la clase:
public class MyReceiver extends ParsePushBroadcastReceiver { protected void onPushReceive(Context mContext, Intent intent) { //enter your custom here generateNotification(); } }
Sólo eliminar super.onPushReceive (contexto, intención); Desde su receptor personalizado para recibir una sola notificación personalizada.
Simplemente agregé mi PushReceiver personalizado con el mismo nombre de paquete que ParsePushReceiver
package com.parse; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import com.squareup.otto.EventBus; import org.json.JSONException; import org.json.JSONObject; import java.util.Locale; import java.util.Random; public class ParsePushReceiver extends ParsePushBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); byte var5 = -1; switch (intentAction.hashCode()) { case -824874927: if (intentAction.equals("com.parse.push.intent.DELETE")) { var5 = 1; } break; case -269490979: if (intentAction.equals("com.parse.push.intent.RECEIVE")) { var5 = 0; } break; case 374898288: if (intentAction.equals("com.parse.push.intent.OPEN")) { var5 = 2; } } switch (var5) { case 0: onPushReceive(context, intent); break; case 1: super.onPushDismiss(context, intent); break; case 2: super.onPushOpen(context, intent); } } @Override protected void onPushReceive(Context context, Intent intent) { try { JSONObject pushData = new JSONObject(intent.getStringExtra("com.parse.Data")); String action; action = pushData.optString("action", null); if (action != null) { Bundle notification = intent.getExtras(); Intent broadcastIntent = new Intent(); broadcastIntent.putExtras(notification); broadcastIntent.setAction(action); broadcastIntent.setPackage(context.getPackageName()); context.sendBroadcast(broadcastIntent); } if (pushData.has(Push.PUSH_TYPE)) { String type = pushData.getString(Push.PUSH_TYPE); switch (PushType.fromString(type)) { case chat: case booked: case rate: case unknown: break; } } else { sendGlobalNoti(context, intent, null); } } catch (JSONException var7) { PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var7); } } private void sendChattingNoti(Context context, Intent intent, PushType pushType) { JSONObject pushData = this.getPushData(intent); if (((User) ParseUser.getCurrentUser()).getChattingNotiEnabled() && pushData != null && pushData.has("title")) { NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context); String title = pushData.optString("title", context.getString(R.string.app_name)); String message = pushData.optString("alert", "Notification received."); switch (pushType) { case booked: message = context.getString(R.string.lesson_booked_message); break; case lessonConfirmed: message = context.getString(R.string.lesson_confirmed); break; case lessonCanceled: message = context.getString(R.string.lesson_canceled); break; } builder.setContentTitle(title); builder.setContentText(message); builder.setTicker(title + ": " + message); builder.setAutoCancel(true); builder.setOnlyAlertOnce(false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_notification)); builder.setSmallIcon(R.drawable.ic_notification); Intent chatIntent = new Intent(Keys.IntentKeys.ACTION_SHOW_CHAT); chatIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); chatIntent.addCategory(Intent.CATEGORY_DEFAULT); String chatId = pushData.optString(Push.PUSH_CHAT_ID, null); if (chatId != null) chatIntent.putExtra(Keys.EXTRA_CHAT_ID, chatId); PendingIntent pending = PendingIntent.getActivity(context, 0, chatIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pending); Notification noti = builder.build(); noti.defaults |= Notification.DEFAULT_VIBRATE; noti.defaults |= Notification.DEFAULT_SOUND; noti.defaults |= Notification.DEFAULT_LIGHTS; nm.notify(pushType.ordinal(), noti); } } private void sendGlobalNoti(Context context, Intent intent, String defaultAlert) { // Global Notification if (((User) ParseUser.getCurrentUser()).getGlobalNotiEnabled()) { Notification notification = getNotification(context, intent, defaultAlert); if (notification != null) ParseNotificationManager.getInstance().showNotification(context, notification); } } protected Notification getNotification(Context context, Intent intent, String defaultAlert) { JSONObject pushData = this.getPushData(intent); if (pushData != null && (pushData.has("alert") || pushData.has("title"))) { String title = pushData.optString("title", ManifestInfo.getDisplayName(context)); String alert = pushData.optString("alert", defaultAlert == null ? "Notification received." : defaultAlert); String tickerText = String.format(Locale.getDefault(), "%s: %s", new Object[]{title, alert}); Bundle extras = intent.getExtras(); Random random = new Random(); int contentIntentRequestCode = random.nextInt(); int deleteIntentRequestCode = random.nextInt(); String packageName = context.getPackageName(); Intent contentIntent = new Intent("com.parse.push.intent.OPEN"); contentIntent.putExtras(extras); contentIntent.setPackage(packageName); Intent deleteIntent = new Intent("com.parse.push.intent.DELETE"); deleteIntent.putExtras(extras); deleteIntent.setPackage(packageName); PendingIntent pContentIntent = PendingIntent.getBroadcast(context, contentIntentRequestCode, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent pDeleteIntent = PendingIntent.getBroadcast(context, deleteIntentRequestCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder parseBuilder = new NotificationCompat.Builder(context); parseBuilder.setContentTitle(title).setContentText(alert).setTicker(tickerText).setSmallIcon(this.getSmallIconId(context, intent)).setLargeIcon(this.getLargeIcon(context, intent)).setContentIntent(pContentIntent).setDeleteIntent(pDeleteIntent).setAutoCancel(true).setDefaults(-1); if (alert != null && alert.length() > 38) { parseBuilder.setStyle((new NotificationCompat.Builder.BigTextStyle()).bigText(alert)); } return parseBuilder.build(); } else { return null; } } private JSONObject getPushData(Intent intent) { try { return new JSONObject(intent.getStringExtra("com.parse.Data")); } catch (JSONException var3) { PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var3); return null; } } }
En el archivo de manifiesto que está utilizando
Com.parse.GcmBroadcastReceiver
En lugar de utilizar su broadcastreciver personalizado, en su caso simple cambio > com.parse.GcmBroadcastReceiver
a com.yourpackagename. IncomingReceiver
com.yourpackagename. IncomingReceiver
No probar BroadcastReceiver en simulador no funcionará así que probarlo en un verdadero Android
Vea este repo que utiliza un broadcastreciver personalizado para la notificación push de parse https://github.com/srini-hashinc/IIYO