samsung Galaxy Note 2 Android version 4.1.2
Je sais que cette question a déjà été posée et que la réponse n'était pas possible
Comment afficher le compteur de ballons sur l'icône du lanceur d'applications sur Android
Néanmoins, hier, j'ai mis à jour l'application facebook et elle a commencé à afficher un compteur de messages privés non lus. Comment se fait-il que je puisse et je ne peux pas utiliser l'application facebook pour mon application?
samsung Galaxy Note 2 Android version 4.1.2
Android ("Vanilla" Android sans lanceurs personnalisés ni interfaces tactiles) n'autorise pas la modification de l'icône de l'application, car celle-ci est scellée. dans le .apk
étroitement une fois le programme compilé. Il n'y a aucun moyen de le changer en un "dessinable" par programme à l'aide d'API standard. Vous pouvez atteindre votre objectif en utilisant un widget au lieu d'une icône. Les widgets sont personnalisables. Veuillez lire ceci: http://www.cnet.com/8301-19736_1-10278814-251.html et ceci http://developer.Android.com/guide/topics/ appwidgets/index.html . Regardez aussi ici: https://github.com/jgilfelt/Android-viewbadger . Cela peut vous aider.
En ce qui concerne les numéros de badge. Comme je l'ai déjà dit, il n'y a pas de moyen standard pour le faire. Mais nous savons tous que Android est un système d'exploitation ouvert et que nous pouvons faire tout ce que nous voulons avec ce dernier. Le seul moyen d'ajouter un numéro de badge est donc d'utiliser des applications tierces ou des lanceurs personnalisés. , ou interfaces tactiles frontales: interface Samsung TouchWiz ou Sony Xperia. D'autres réponses utilisent ces fonctionnalités et vous pouvez les rechercher sur stackoverflow, par exemple. ici . Mais je vais répéter encore une fois: il y a non API standard pour cela et je veux dire que c'est un mauvais entraine toi. Le badge de notification d'icône d'application est un modèle iOS et il ne doit en aucun cas être utilisé dans les applications Android. Dans Andrioid, il existe une notification dans la barre d’état à ces fins: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html Donc, si Facebook ou une autre personne l’utilise - ce n'est pas un modèle ou une tendance commune que nous devrions considérer. Mais si vous insistez quand même et que vous ne voulez pas utiliser les widgets de l'écran d'accueil, regardez ici, s'il vous plaît:
Comment Facebook ajoute-t-il des numéros de badge sur l'icône de l'application dans Android?
Comme vous le voyez, ce n’est pas une application Facebook, c’est TouchWiz. Dans Vanilla Android, cela peut être réalisé avec Nova Launcher http://forums.androidcentral.com/Android-applications/199709-how-guide-global-badge-notifications.html Donc, si vous voyez des badges d’icône quelque part, assurez-vous qu’il s’agit d’un lanceur tiers ou d’une interface tactile (wrapper frontal). Peut-être que Google ajoutera cette fonctionnalité à l'API Android standard.
Cela fonctionne dans le lanceur 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;
}
ShortcutBadger est une bibliothèque qui ajoute une couche d’abstraction sur la marque de l’appareil et sur le lanceur actuel et offre un excellent résultat. Fonctionne avec LG, Sony, Samsung, HTC et autres lanceurs personnalisés.
Il dispose même d'un moyen d'afficher le nombre de badges dans le bureau Pure Android.
Mettre à jour le nombre de badges dans l'icône de l'application est aussi simple que d'appeler:
int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);
Il comprend une application de démonstration qui vous permet de tester son comportement.
J'ai compris comment cela est fait pour les appareils Sony.
J'ai blogué à ce sujet ici . J'ai également posté une question séparée SO à ce sujet ici .
Les appareils Sony utilisent une classe nommée BadgeReciever
.
Déclarez la permission com.sonyericsson.home.permission.BROADCAST_BADGE
dans votre fichier manifeste:
Diffusez un Intent
vers le BadgeReceiver
:
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);
Terminé. Une fois cette Intent
diffusée, le lanceur devrait afficher un badge sur l’icône de votre application.
Pour supprimer à nouveau le badge, envoyez simplement une nouvelle diffusion, cette fois avec SHOW_MESSAGE
défini sur false:
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
J'ai exclu les détails sur la façon dont j'ai trouvé ceci pour garder la réponse courte, mais tout est disponible dans le blog. Peut-être une lecture intéressante pour quelqu'un.
Ceci est un exemple et la meilleure façon d’afficher un badge sur l’icône du lanceur de notifications.
Ajouter cette classe dans votre application
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 Utilisez la classe BadgeUtils lorsque la notification arrive.
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;
}
}
Et notification claire par préférence et aussi avec le nombre de badges
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" />