android - samsung - Cómo mostrar el recuento de notificaciones en el icono del iniciador de aplicaciones
notificaciones whatsapp android 8 (5)
Esta pregunta ya tiene una respuesta aquí:
samsung galaxy note 2 versión de Android 4.1.2
Sé que esta pregunta fue hecha antes y la respuesta no fue posible
Cómo mostrar el contador de globos sobre el icono del iniciador de aplicaciones en Android
Sin embargo, ayer actualicé la aplicación de Facebook y comenzó a mostrar un contador de mensajes privados no leídos. ¿Cómo es que la aplicación de Facebook puede y no puedo hacerlo para mi aplicación?
samsung galaxy note 2 versión de Android 4.1.2
Esta es una muestra y la mejor forma de mostrar la insignia en el icono del iniciador 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 Utilice la clase BadgeUtils cuando llegue 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 notificación clara de preferencia y también con el recuento de distintivos
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" />
Funciona en el lanzador de Samsung touchwiz
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;
}
He descubierto cómo se hace esto para los dispositivos de Sony.
He escrito sobre esto here . También publiqué una pregunta sobre SO por separado here .
Los dispositivos Sony usan una clase llamada BadgeReciever
.
Declare el permiso
com.sonyericsson.home.permission.BROADCAST_BADGE
en su archivo de manifiesto:Transmita una
Intent
alBadgeReceiver
: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
Intent
esteIntent
el iniciador debe mostrar una insignia en el icono de su aplicación.Para eliminar la insignia nuevamente, simplemente envíe una nueva transmisión, esta vez con
SHOW_MESSAGE
establecido en falso:intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
He excluido detalles sobre cómo encontré esto para mantener la respuesta corta, pero está todo disponible en el blog. Puede ser una lectura interesante para alguien.
ShortcutBadger es una biblioteca que agrega una capa de abstracción sobre la marca del dispositivo y el iniciador actual y ofrece un gran resultado. Funciona con LG, Sony, Samsung, HTC y otros lanzadores personalizados.
Incluso tiene una forma de mostrar el recuento de distintivos en el escritorio de los dispositivos Pure Android.
Actualizar el recuento de identificaciones 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.
Android (Android "vainilla" sin iniciadores personalizados e interfaces táctiles) no permite cambiar el icono de la aplicación, ya que está sellado en el .apk
una vez que se compila el programa. No hay forma de cambiarlo programáticamente mediante API estándar. Puede lograr su objetivo utilizando un widget en lugar de un ícono. Los widgets son personalizables. 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 . Te puede ayudar.
En cuanto a los números de placa. Como dije antes, no hay una forma estándar para hacer esto. Pero todos sabemos que Android es un sistema operativo abierto y que podemos hacer todo lo que queramos con él, por lo que la única forma de agregar un número de placa es utilizar aplicaciones de terceros o lanzadores personalizados, o toque de front-end. interfaces: Samsung TouchWiz o la interfaz de Sony Xperia. Otras respuestas usan estas capacidades y puedes buscar esto en , por ejemplo here . Pero lo 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 icono de la aplicación es un patrón de iOS y, de todos modos, no debería usarse en las aplicaciones de Android. En Andrioid hay notificaciones de la barra de estado para estos fines: http://developer.android.com/guide/topics/ui/notifiers/notifications.html Entonces, si Facebook u otra persona lo usa, no es un patrón común o tendencia que debemos considerar. Pero si insistes de todos modos y no quieres usar los widgets de la pantalla de inicio, mira aquí, por favor:
¿Cómo agrega Facebook los números de la insignia en el ícono de la aplicación en Android?
Como ves, esta no es una aplicación de Facebook real, es TouchWiz. En vanilla android, esto se puede lograr con Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html Así que si ve insignias de iconos en alguna parte, asegúrese de que sea un iniciador de terceros o una interfaz táctil (contenedor de frontend). Puede que en algún momento Google agregue esta capacidad a la API estándar de Android.