桌面图标显示未读消息(适配部分主流机型)

/**

 *

 */

public class BadgeUtilDeskTop {

    /**

     *  对外提供调用的方法

     * @param context 上下文

     * @param count    数量

     */

    public static void setBadgeCount(Context context, int count) {

        if (count <= 0) {

            count = 0;

        } else {

            count = Math.max(0, Math.min(count, 99));

        }

        if ("xiaomi".equalsIgnoreCase(Build.MANUFACTURER)) {

            sendToXiaoMi(context, count);     //ok,但是小米miui9要自己去通知栏设置为重要通知,否则不生效

        } else if ("sony".equalsIgnoreCase(Build.MANUFACTURER)) {

            sendToSony(context, count);//未测试

        } else if (Build.MANUFACTURER.toLowerCase().contains("samsung") ||

                Build.MANUFACTURER.toLowerCase().contains("lg")) {

            sendToSamsumg(context, count);//三星ok  lg未测试

        } else if (Build.MANUFACTURER.toLowerCase().contains("htc")) {

            setBadgeOfHTC(context, count);//未测试

        }

//        else if (Build.MANUFACTURER.toLowerCase().contains("nova")) {

//            setBadgeOfNova(context, count);

//        }

        else if (Build.MANUFACTURER.toLowerCase().contains("vivo")) {

            sendToVivo(context, count);//vivoX9Splus不支持

        }else if (Build.MANUFACTURER.toLowerCase().contains("huawei")) {

            sendToHuawei(context, count);//EMUI 3.1及以上

        }else {

            L.e("不支持桌面显示角标");

        }

    }

    /**

     * 向小米手机发送未读消息数广播

     *

     * @param count

     */

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)

    private static void sendToXiaoMi(Context context, int count) {

                NotificationManager mNotificationManager = (NotificationManager) context

                        .getSystemService(Context.NOTIFICATION_SERVICE);

                Notification.Builder builder = new Notification.Builder(context)

                        .setContentTitle("通知").setContentText("您有"+count+"条消息未读").setSmallIcon(R.drawable.logo);

                Notification notification = builder.build();

                try {

                    Field field = notification.getClass().getDeclaredField("extraNotification");

                    Object extraNotification = field.get(notification);

                    Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);

                    method.invoke(extraNotification, count);

                } catch (Exception e) {

                    e.printStackTrace();

                }

                mNotificationManager.notify(0,notification);


//        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 > 99 ? "99+" : 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 > 99 ? "99+" : 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 == 0 ? "" : (count > 99 ? "99+" : count)));// 数字

        localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME",

                    context.getPackageName());// 包名

        context.sendBroadcast(localIntent);

    }

    /**

     * 向三星手机发送未读消息数广播    ok

     *

     * @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);

    }

    /**

     * 向ViVo手机发送未读消息数广播

     *

     * @param count

     */

    private static void sendToVivo(Context context, int count) {

        String launcherClassName = getLauncherClassName(context);

        if (launcherClassName == null) {

            return;

        }

        Intent localIntent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");

        localIntent.putExtra("packageName", context.getPackageName());

        localIntent.putExtra("className",launcherClassName);

        localIntent.putExtra("notificationNum", count);

        context.sendBroadcast(localIntent);

    }

    /**

     * 向华为手机发送未读消息数广播

     *

     * @param count

     */

    private static void sendToHuawei(Context context, int count) {

        String launcherClassName = getLauncherClassName(context);

        if (launcherClassName == null) {

            return;

        }

        try{

            Bundle localBundle = new Bundle();

            localBundle.putString("package", context.getPackageName());

            localBundle.putString("class", launcherClassName);

            localBundle.putInt("badgenumber", count);

            context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, localBundle);

        }catch(Exception e){

            e.printStackTrace();

            Log.e("HUAWEI" + " Badge error", "set Badge failed");

        }

    }


    /**

     * 设置HTC的Badge

     *

     * @param context context

     * @param count   count

     */

    private static void setBadgeOfHTC(Context context, int count) {

        Intent intentNotification = new Intent("com.htc.launcher.action.SET_NOTIFICATION");

        ComponentName localComponentName = new ComponentName(context.getPackageName(),

                getLauncherClassName(context));

        intentNotification.putExtra("com.htc.launcher.extra.COMPONENT", localComponentName.flattenToShortString());

        intentNotification.putExtra("com.htc.launcher.extra.COUNT", count);

        context.sendBroadcast(intentNotification);

        Intent intentShortcut = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT");

        intentShortcut.putExtra("packagename", context.getPackageName());

        intentShortcut.putExtra("count", count);

        context.sendBroadcast(intentShortcut);

    }

    /**

     * 设置Nova的Badge

     *

     * @param context context

     * @param count   count

     */

    private static void setBadgeOfNova(Context context, int count) {

        ContentValues contentValues = new ContentValues();

        contentValues.put("tag", context.getPackageName() + "/" +

                getLauncherClassName(context));

        contentValues.put("count", count);

        context.getContentResolver().insert(Uri.parse("content://com.teslacoilsw.notifier/unread_count"),

                contentValues);

    }

    /**

     * 重置、清除Badge未读显示数<br/>

     *

     * @param context

     */

    public static void resetBadgeCount(Context context) {

        setBadgeCount(context, 0);

    }

    /**

     * 获取Launcher的名字,

     * @param context

     *            上下文

     * @return launcher name

     */

    private static String getLauncherClassName(Context context) {

        PackageManager packageManager = context.getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN);

        // 添加包名限制.

        intent.setPackage(context.getPackageName());

        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        ResolveInfo info = packageManager.resolveActivity(intent,  PackageManager.MATCH_DEFAULT_ONLY);

        if (info == null) {

            info = packageManager.resolveActivity(intent, 0);

        }

        return info.activityInfo.name;

    }

}

注意:

适配

魅族,vivoX9Splus,oppo不支持(oppo支持的版本太低,2。0-3。0左右,所以不做,没意义)

华为,索尼,三星,vivo,小米,lg,htc,

小米miui9要自己去通知栏设置为重要通知,否则不生效

华为:EMUI 3.1及以上

Vivo:vivoX9Splus不支持

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容