Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

RothenL/test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

3 Commits

Repository files navigation

import java.lang.reflect.Field;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.widget.Toast;
/**
 * 应用启动图标未读消息数显示 工具类 (效果如:QQ、微信、未读短信 等应用图标)<br/>
 * 依赖于第三方手机厂商(如:小米、三星)的Launcher定制、原生系统不支持该特性<br/>
 * 该工具类 支持的设备有 小米、三星、索尼【其中小米、三星亲测有效、索尼未验证】
 * @author ice_zhengbin@163.com
 *
 */
public class BadgeUtil {
 /**
 * Set badge count<br/>
 * 针对 Samsung / xiaomi / sony 手机有效
 * @param context The context of the application package.
 * @param count Badge count to be set
 */
 public static void setBadgeCount(Context context, int count) {
 if (count <= 0) {
 count = 0;
 } else {
 count = Math.max(0, Math.min(count, 99));
 }
 if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) {
 sendToXiaoMi(context, count);
 } else if (Build.MANUFACTURER.equalsIgnoreCase("sony")) {
 sendToSony(context, count);
 } else if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {
 sendToSamsumg(context, count);
 } else {
 Toast.makeText(context, "Not Support", Toast.LENGTH_LONG).show();
 }
 }
 /**
 * 向小米手机发送未读消息数广播
 * @param count
 */
 private static void sendToXiaoMi(Context context, int count) {
 try {
 Class miuiNotificationClass = Class.forName("android.app.MiuiNotification");
 Object miuiNotification = miuiNotificationClass.newInstance();
 Field field = miuiNotification.getClass().getDeclaredField("messageCount");
 field.setAccessible(true);
 field.set(miuiNotification, String.valueOf(count == 0 ? "" : count)); // 设置信息数-->这种发送必须是miui 6才行
 } catch (Exception e) {
 e.printStackTrace();
 // miui 6之前的版本
 Intent localIntent = new Intent(
 "android.intent.action.APPLICATION_MESSAGE_UPDATE");
 localIntent.putExtra(
 "android.intent.extra.update_application_component_name",
 context.getPackageName() + "/" + getLauncherClassName(context));
 localIntent.putExtra(
 "android.intent.extra.update_application_message_text", String.valueOf(count == 0 ? "" : count));
 context.sendBroadcast(localIntent);
 }
 }
 /**
 * 向索尼手机发送未读消息数广播<br/>
 * 据说:需添加权限:<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> [未验证]
 * @param count
 */
 private static void sendToSony(Context context, int count){
 String launcherClassName = getLauncherClassName(context);
 if (launcherClassName == null) {
 return;
 }
 boolean isShow = true;
 if (count == 0) {
 isShow = false;
 }
 Intent localIntent = new Intent();
 localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
 localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE",isShow);//是否显示
 localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",launcherClassName );//启动页
 localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));//数字
 localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());//包名
 context.sendBroadcast(localIntent);
 }
 /**
 * 向三星手机发送未读消息数广播
 * @param count
 */
 private static void sendToSamsumg(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);
 }
 /**
 * 重置、清除Badge未读显示数<br/>
 * @param context
 */
 public static void resetBadgeCount(Context context) {
 setBadgeCount(context, 0);
 }
 /**
 * Retrieve launcher activity name of the application from the context
 *
 * @param context The context of the application package.
 * @return launcher activity name of this application. From the
 * "android:name" attribute.
 */
 private static String getLauncherClassName(Context context) {
 PackageManager packageManager = context.getPackageManager();
 Intent intent = new Intent(Intent.ACTION_MAIN);
 // To limit the components this Intent will resolve to, by setting an
 // explicit package name.
 intent.setPackage(context.getPackageName());
 intent.addCategory(Intent.CATEGORY_LAUNCHER);
 // All Application must have 1 Activity at least.
 // Launcher activity must be found!
 ResolveInfo info = packageManager
 .resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
 // get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER
 // if there is no Activity which has filtered by CATEGORY_DEFAULT
 if (info == null) {
 info = packageManager.resolveActivity(intent, 0);
 }
 return info.activityInfo.name;
 }
}
在启动的Activity中、发送未读消息数目广播 和 重置/清除未读消息数目广播 的调用如下: 
// 发送未读消息数目广播:count为未读消息数目(int类型)
BadgeUtil.setBadgeCount(getApplicationContext(), count);
// 发送重置/清除未读消息数目广播:
BadgeUtil.resetBadgeCount(getApplicationContext());

About

第一个

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle によって変換されたページ (->オリジナル) /