Here I am going to explain how to set badge or count in Android app icon
Android without custom launchers and touch interfaces does not allow changing of the application icon, because it is sealed in the .apk tightly once the program is compiled. There is no way to change it to a 'drawable' programmatically using standard APIs.So the below code works only in Samsung,Htc,Sony etc.
Step 1)BadgeUtils.java
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import java.util.List;
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;
}
}
Step 2)MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText numInput = (EditText) findViewById(R.id.numInput);
Button button = (Button) findViewById(R.id.btnSetBadge);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int badgeCount = 0;
try {
badgeCount = Integer.parseInt(numInput.getText().toString());
}
catch (NumberFormatException e)
{
Toast.makeText(getApplicationContext(), "Error input", Toast.LENGTH_SHORT).show();
}
BadgeUtils.setBadge(MainActivity.this, badgeCount);
}
});
Button removeBadgeBtn = (Button) findViewById(R.id.btnRemoveBadge);
removeBadgeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BadgeUtils.clearBadge(MainActivity.this);
}
});
}
}
Happy Coding :)

No comments:
Post a Comment