android - quitar - trucos sony xperia l1
¿Cómo agregar una insignia de notificación/conteo al ícono de la aplicación en los dispositivos Sony Xperia? (4)
Bueno, esto es bastante difícil de hacer. La única forma que he encontrado hasta ahora es crear un widget
que maneje tanto el ícono de la aplicación como la insignia.
Te sugiero que visites esta página donde aprenderás cómo lograrlo: Android: ¿Es posible actualizar ImageView / ImageButton con un número para mostrar la cantidad de mensajes nuevos?
Con Xperia Home de Sony, ciertas aplicaciones tienen la capacidad de mostrar una burbuja o distintivo de conteo en el ícono de la aplicación. Facebook y Facebook Messenger hacen esto, así como la aplicación de correo electrónico integrada.
Esto ha sido resuelto para el lanzador de Samsung , pero no he encontrado ninguna documentación sobre cómo hacerlo para el lanzador de Sony.
¿Cómo puede hacerse esto?
Después de haber visto la solución de Daniel Ochoa para el lanzador de Samsung, que utiliza un BadgeProvider para manejar las insignias, me puse a hacer lo mismo con el Xperia Home de Sony. Esta respuesta se toma directamente marcusforsberg.net/blog/… .
Cómo lo descubrí - Para cualquier persona interesada
Me encontré con AppXplore de Sony y lo usé para verificar los permisos de la aplicación de Facebook. La aplicación de Facebook solicita el siguiente permiso, que es la clave para mostrar las insignias en los dispositivos de Sony:
com.sonyericsson.home.permission.BROADCAST_BADGE
A continuación, eché un vistazo a todos los proveedores de contenido disponibles, pero no encontré nada relacionado con las insignias del icono de la aplicación allí. Ejecuté el comando en esta respuesta para obtener un archivo de volcado del sistema y busqué "insignia" usando Notepad ++. Encontré esto:
com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home / .BadgeService $ BadgeReceiver filter 41be9858
Por lo tanto, se maneja utilizando un BroadcastReciever en Sony en lugar de un proveedor de contenido de Samsung. Así que creé un BroadcastReciever ficticio, escuchando la acción com.sonyericsson.home.action.UPDATE_BADGE, y descubrí que los extras se pasaron al BadgeService de Sony. Para esto, también necesitaba un permiso, pero eso fue fácil de encontrar en el archivo de volcado:
com.sonyericsson.home.permission.RECEIVE_BADGE
Los extras enviados por Facebook, la aplicación de correo electrónico, etc. son:
- com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME : el nombre de la actividad principal de su aplicación, android.intent.action.MAIN. Esto es para que el iniciador sepa en qué icono mostrar la insignia.
- com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE - un booleano que indica si queremos mostrar la insignia o no (lo que hacemos)
- com.sonyericsson.home.intent.extra.badge.MESSAGE - una cadena (no un número entero) que me llevó un tiempo darme cuenta ...) con el número que se muestra.
- com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME : el nombre de su paquete de aplicación.
Cómo mostrar insignias en el ícono del iniciador de su aplicación en dispositivos Sony Xperia
Entonces, resulta muy simple mostrar una insignia en el ícono de su aplicación en el iniciador. IMO es mucho más directo que para el lanzador de Samsung. Aquí hay una guía paso a paso (¡y no es larga!)
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);
Bueno saber
¡El mensaje es una cadena!
Como MESSAGE
es una String
, puedes agregar palabras a la insignia:
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");
Pero no haría eso porque parece extraño.
¡Tienes acceso a todas las aplicaciones!
El permiso BROADCAST_BADGE
no solo le da acceso al icono de su propia aplicación, sino a TODOS ellos. Por ejemplo, aquí puedes ver cómo puedes configurar la insignia de Facebook:
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.facebook.katana.LoginActivity");
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.facebook.katana");
sendBroadcast(intent);
¡Espero que esto haya sido de ayuda para alguien! :)
Me doy cuenta de que esta pregunta es bastante antigua, pero para fines históricos, la API para aplicaciones de terceros para interactuar con la API de Xperia Home para esta característica en particular se hizo pública el año pasado:
La API Xperia Home badge ahora está disponible públicamente
Con código de ejemplo aquí:
También hay una biblioteca de terceros que admite la mayoría de los principales proveedores de teléfonos, incluida la Xperia Home API:
Utilizo esta clase para dispositivos Samsung, Sony y HTC (también disponible https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). No olvides agregar <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
a AndroidManifest.xml
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;
}
}