it-swarm-eu.dev

Jak zobrazit počet oznámení v ikoně spouštěče aplikací

samsung galaxy note 2 Android version 4.1.2

Vím, že tato otázka byla položena dříve a odpověď nebyla možná

Jak zobrazit počítadlo bublin nad ikonou spouštěče aplikací v systému Android

Přesto jsem včera aktualizoval aplikaci Facebook a začalo se zobrazovat počítadlo nepřečtených zpráv soukromých zpráv. Jak to, že aplikace Facebook může a nemůžu to udělat pro svou aplikaci?

facebook icon

enter image description here

samsung galaxy note 2 Android version 4.1.2

180
Waqleh

Android ("Vanilla" Android bez vlastních spouštěčů a dotykových rozhraní) neumožňuje změnu ikony aplikace, protože je zapečetěna v .apk těsně po kompilaci programu. Neexistuje žádný způsob, jak programově změnit na „natahovatelný“ pomocí standardních API. Cíle můžete dosáhnout pomocí widgetu namísto ikony. Widgety jsou přizpůsobitelné. Přečtěte si toto: http://www.cnet.com/8301-19736_1-10278814-251.html a toto http://developer.Android.com/guide/topics/ appwidgets/index.html . Podívejte se také zde: https://github.com/jgilfelt/Android-viewbadger . Může vám pomoci.

Pokud jde o čísla odznaků. Jak jsem řekl dříve - neexistuje žádný standardní způsob, jak toho dosáhnout. Všichni však víme, že Android je otevřený operační systém a můžeme s ním dělat vše, co chceme, takže jediným způsobem, jak přidat číslo odznaku, je použít některé aplikace třetí strany nebo vlastní spouštěče nebo rozhraní front-end: rozhraní Samsung TouchWiz nebo Sony Xperia. Ostatní odpovědi používají tuto schopnost a můžete ji hledat v stackoverflow, např. zde . Ale ještě jednou zopakuji: pro to existuje žádné standardní API a chci říct, že je to špatné praxe. Odznak oznámení ikony aplikace je vzorem pro iOS a v aplikacích Android by neměl být použit. V Andrioidu jsou oznámení o stavovém řádku pro tyto účely: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html Takže, pokud to používá Facebook nebo někdo jiný - není to obvyklý vzor nebo trend, který bychom měli zvážit. Pokud ale přesto trváte na tom, že nechcete používat widgety domovské obrazovky, podívejte se sem:

Jak Facebook přidává čísla odznaků na ikonu aplikace v Androidu?

Jak vidíte, nejedná se o skutečnou aplikaci na Facebooku, je to TouchWiz. Ve Vanille Android to lze dosáhnout pomocí Nova Launcher http://forums.androidcentral.com/Android-applications/199709-how-guide-global-badge-notifications.html Pokud tedy někde uvidíte odznaky ikon, ujistěte se, že se jedná o spouštěč třetí strany nebo dotykové rozhraní (přední rozhraní). Může být někdy Google přidá tuto schopnost do standardního Android API.

114

Funguje v launcheru 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;
}
91
ChangUZ

ShortcutBadger je knihovna, která přidává abstrakční vrstvu přes značku zařízení a aktuální spouštěč a nabízí skvělý výsledek. Spolupracuje s LG, Sony, Samsung, HTC a dalšími vlastními spouštěči.

Má dokonce způsob, jak zobrazit počet odznaků na ploše zařízení Pure Android.

Aktualizace počtu odznaků v ikoně aplikace je stejně snadná jako volání:

int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);

Zahrnuje demonstrační aplikaci, která vám umožní otestovat její chování.

76
AlexGuti

Přišel jsem na to, jak se to dělá pro zařízení Sony.

Blogoval jsem o tom zde . O této otázce jsem také napsal samostatnou SO otázku zde .


Zařízení Sony používají třídu s názvem BadgeReciever.

  1. Prohlásit oprávnění com.sonyericsson.home.permission.BROADCAST_BADGE v souboru manifestu:

  2. Vysílejte Intent na 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);
    
  3. Hotovo. Jakmile je toto Intent vysíláno, měl by launcher na ikoně aplikace zobrazit odznak.

  4. Chcete-li odznak znovu odebrat, jednoduše odešlete nové vysílání, tentokrát s SHOW_MESSAGE nastaveným na false:

    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
    

Vyloučil jsem podrobnosti o tom, jak jsem zjistil, že tato odpověď je krátká, ale vše je k dispozici v blogu. Může to být pro někoho zajímavé čtení.

12
Marcus

Toto je ukázkový a nejlepší způsob, jak zobrazit ikonu na ikonu spouštěče oznámení.

Přidejte tuto aplikaci do své aplikace

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 Použijte třídu BadgeUtils, když dorazí oznámení.

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;
    }
}

A jasné oznámení od preference a také s odznakem

 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" />
8
Jaydeep purohit