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?
samsung galaxy note 2 Android version 4.1.2
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.
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;
}
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í.
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
.
Prohlásit oprávnění com.sonyericsson.home.permission.BROADCAST_BADGE
v souboru manifestu:
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);
Hotovo. Jakmile je toto Intent
vysíláno, měl by launcher na ikoně aplikace zobrazit odznak.
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í.
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" />