Cómo mostrar el recuento de notificaciones en el icono del lanzador de aplicaciones
Samsung galaxy note 2 versión android 4.1.2
Sé que esta pregunta fue hecha antes y la respuesta no fue posible
- Agregar una notificación nueva cuando recibe notificación push (no reemplaza la antigua)
- ¿Es posible reducir el tiempo de notificación que se muestra en Android?
- Cómo especificar min y / o longitud máxima en RemoteInput
- Android: notificación incorrecta publicada sólo en Android 2.3
- Haga clic en notificación para ingresar mi aplicación en android
Cómo mostrar el contador de globo sobre el icono del lanzador de aplicaciones en android
Sin embargo ayer actualizé la aplicación facebook y empezó a mostrar un contador de mensajes no leídos mensajes privados. ¿Cómo es posible que Facebook app y no pueda hacerlo para mi aplicación?
Samsung galaxy note 2 versión android 4.1.2
- Mostrar texto del ticker de notificación de la barra de estado cuando la pantalla está bloqueada en Android
- ¿Cómo mostrar las notificaciones de Android en la pantalla, así como el icono de la barra de estado?
- Apertura del navegador en la notificación push
- Acciones de notificaciones de Android sin abrir la aplicación
- Android: ¿Cómo puedo poner mi notificación encima del área de notificación?
- Notificación ampliable android 4.1
- PendingIntent funciona correctamente para la primera notificación pero incorrectamente para el resto
- En Android, ¿cómo puedo saber el ID de notificación actual para borrar la notificación
Android ("vainilla" androide sin lanzadores personalizados e interfaces táctiles) no permite cambiar el icono de la aplicación, porque está sellado en el .apk
firmemente una vez que el programa se compila. No hay forma de cambiarlo a un 'dibujable' mediante programación utilizando API estándar. Puede alcanzar su objetivo utilizando un widget en lugar de un icono. Los widgets son personalizables. Por favor, lea esto: http://www.cnet.com/8301-19736_1-10278814-251.html y este http://developer.android.com/guide/topics/appwidgets/index.html . También mira aquí: https://github.com/jgilfelt/android-viewbadger . Puede ayudarle.
En cuanto a los números de insignia. Como he dicho antes, no hay una forma estándar de hacerlo. Pero todos sabemos que Android es un sistema operativo abierto y podemos hacer todo lo que queremos con él, por lo que la única forma de agregar un número de insignia es utilizar algunas aplicaciones de terceros o lanzadores personalizados o el toque frontal Interfaces: Samsung TouchWiz o la interfaz de Sony Xperia. Otras respuestas utilizan esta capacidad y puede buscar esto en stackoverflow, por ejemplo, aquí . Pero voy a repetir una vez más: no hay una API estándar para esto y quiero decir que es una mala práctica. La insignia de notificación de iconos de la aplicación es un patrón de iOS y no debería utilizarse en las aplicaciones de Android de todos modos. En Andrioid hay una notificación de la barra de estado para estos propósitos: http://developer.android.com/guide/topics/ui/notifiers/notifications.html Así que, si Facebook o alguien otro usa esto – no es un patrón común o Tendencia que debemos considerar. Pero si usted insiste de todos modos y no quiere usar widgets pantalla de inicio a continuación, busque aquí, por favor:
¿Cómo agrega Facebook números de insignia en el icono de la aplicación en Android?
Como usted ve esto no es una aplicación de Facebook real es TouchWiz. En Android vainilla esto se puede lograr con Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html Así que si usted verá insignias icono en alguna parte, asegúrese de que es Ya sea un lanzador de terceros o una interfaz táctil (frontend wrapper). Puede que alguna vez Google agregue esta capacidad a la API estándar de Android.
Funciona en samsung touchwiz lanzador
public static void setBadge(Context context, int count) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); intent.putExtra("badge_count", count); intent.putExtra("badge_count_package_name", context.getPackageName()); intent.putExtra("badge_count_class_name", launcherClassName); context.sendBroadcast(intent); } public static String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resolveInfos) { String pkgName = resolveInfo.activityInfo.applicationInfo.packageName; if (pkgName.equalsIgnoreCase(context.getPackageName())) { String className = resolveInfo.activityInfo.name; return className; } } return null; }
ShortcutBadger es una biblioteca que agrega una capa de abstracción sobre la marca del dispositivo y el lanzador actual y ofrece un gran resultado. Funciona con LG, Sony, Samsung, HTC y otros lanzadores personalizados.
Incluso tiene una manera de mostrar el recuento de insignias en dispositivos de escritorio Pure Android.
Actualizar el recuento de insignias en el icono de la aplicación es tan fácil como llamar:
int badgeCount = 1; ShortcutBadger.applyCount(context, badgeCount);
Incluye una aplicación de demostración que le permite probar su comportamiento.
He descubierto cómo se hace esto para los dispositivos de Sony.
He publicado un blog sobre esto aquí . También he publicado un seperate SO pregunta sobre esto aquí .
Los dispositivos de Sony utilizan una clase llamada BadgeReciever
.
-
Declare el permiso
com.sonyericsson.home.permission.BROADCAST_BADGE
en su archivo de manifiesto: -
Difundir una
Intent
a laBadgeReceiver
:Intent intent = new Intent(); intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp"); sendBroadcast(intent);
-
Hecho. Una vez que se transmita esta
Intent
el lanzador debe mostrar una insignia en el icono de la aplicación. -
Para quitar la insignia de nuevo, simplemente envíe una nueva emisión, esta vez con
SHOW_MESSAGE
establecido en false:intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
He excluido detalles sobre cómo encontré esto para mantener la respuesta breve, pero todo está disponible en el blog. Podría ser una lectura interesante para alguien.
Esta es la muestra y la mejor manera de mostrar la insignia en el icono del lanzador de notificaciones.
Agregue esta clase en su aplicación
public class BadgeUtils { public static void setBadge(Context context, int count) { setBadgeSamsung(context, count); setBadgeSony(context, count); } public static void clearBadge(Context context) { setBadgeSamsung(context, 0); clearBadgeSony(context); } private static void setBadgeSamsung(Context context, int count) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); intent.putExtra("badge_count", count); intent.putExtra("badge_count_package_name", context.getPackageName()); intent.putExtra("badge_count_class_name", launcherClassName); context.sendBroadcast(intent); } private static void setBadgeSony(Context context, int count) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent(); intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count)); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName()); context.sendBroadcast(intent); } private static void clearBadgeSony(Context context) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent(); intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0)); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName()); context.sendBroadcast(intent); } private static String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resolveInfos) { String pkgName = resolveInfo.activityInfo.applicationInfo.packageName; if (pkgName.equalsIgnoreCase(context.getPackageName())) { String className = resolveInfo.activityInfo.name; return className; } } return null; } }
==> MyGcmListenerService.java Utiliza la clase BadgeUtils cuando llega la notificación.
public class MyGcmListenerService extends GcmListenerService { private static final String TAG = "MyGcmListenerService"; @Override public void onMessageReceived(String from, Bundle data) { String message = data.getString("Msg"); String Type = data.getString("Type"); Intent intent = new Intent(this, SplashActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle(); bigTextStyle .setBigContentTitle(getString(R.string.app_name)) .bigText(message); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(getNotificationIcon()) .setContentTitle(getString(R.string.app_name)) .setContentText(message) .setStyle(bigTextStyle) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); int color = getResources().getColor(R.color.appColor); notificationBuilder.setColor(color); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this); unOpenCount=unOpenCount+1; AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this); notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build()); // This is for bladge on home icon BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount); } private int getNotificationIcon() { boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP); return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher; } }
Y la notificación clara de preferencia y también con el recuento de la insignia
public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); AppUtill.savePreferenceLong("NOTICOUNT",0,this); BadgeUtils.clearBadge(this); } }
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />