android 为桌面图标添加数字角标

android 为桌面图标添加数字角标

我的github项目 BadgeForAppIcon
看完麻烦 star 一下

在某些app的设计中,产品经理总会想当然的提出为桌面图标添加数字角标的需求。作为一个开发者当然只能努力的去实现,然后你打开了百度。。。

一、“砖”

这种问题你会在百度上找到很多答案,拿来一块砖开心的就贴在了你的demo里,然后运气好的你拿起了你手里的huawei、sumsung,运气不好的朋友手里拿着oppo、vivo、xiaomi或其他
“运气不好”的原因很简单,你找的“砖”在这些设备上没用。
文章最后会吐槽一下为啥你搜到的方法不管用,下面直接给你块好用的“砖”。

二、支持列表

我的github项目 BadgeForAppIcon
看完麻烦 star 一下

手机厂商(launcher) 是否支持(Y/N) launcher package name
HUAWEI Y com.huawei.android.launcher
XIOAMI Y* com.miui.home
OPPO Y*
VIVO N*
GOOGLE Y* com.google.android.apps.nexuslauncher
MEIZU N
SAMSUNG Y* com.sec.android.app.launcher

*:有特殊情况,会在第三节中详细说明

2.1、判断当前launcher

这里需要注意的是,是否支持角标并不与手机厂商有关,而是你当前使用的launcher开发厂商有关。

  • 比如:你用着华为手机,却用着魅族的launcher,那肯定是不会成功的显示出桌面角标的
  • 相反的,你用着某一款手机却用着华为的launcher,一样可以显示出桌面图标角标

获取当前launcher包名的方法

public static String getLauncherPackageName() {
        //获取ApplicationContext
        final Context context = App.getInstance().getBaseContext();
        final Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        final ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0);
        if (res.activityInfo == null) {
            // should not happen. A home is always installed.
            return null;
        }
        if (res.activityInfo.packageName.equals("android")) {
            return null;
        } else {
            return res.activityInfo.packageName;
        }
    }

三、方法实现

3.1、华为(荣耀)

官方文档:https://developer.huawei.com/consumer/cn/devservice/doc/30802

    private void setHUAWEIIconBadgeNum(int count) throws Exception {
        final Context context = App.getInstance().getBaseContext();
        Bundle bunlde = new Bundle();
        bunlde.putString("package", context.getPackageName());
        bunlde.putString("class", CappUtils.getLaunchIntentForPackage());
        bunlde.putInt("badgenumber", count);
        context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde);
    }

3.2、小米

官方文档:https://dev.mi.com/console/doc/detail?pId=939

    private Notification setXIAOMIIconBadgeNum(int count, Notification notification) throws Exception {
        Field field = notification.getClass().getDeclaredField("extraNotification");
        Object extraNotification = field.get(notification);
        Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
        method.invoke(extraNotification, count);
        return notification;
    }

小米实现时,需要注意一下几点:

  • 必须发送notification
  • 只支持MIUI6-10(网上有针对6以下的砖,我没法验证,所以这里就不贴出来了)
  • 当APP处于前台时,数字会自动清空(因此,APP必须处于后台时才可以设置成功)

为什么这么多限制,与我用的邮箱或那些聊天软件不一样?

  • 我会在最后一节吐槽这个事

3.3、OPPO

首先,官方客服和我说他们可以支持,但需要申请

而抱歉的是截止目前我还没有得到具体的方法,因为我们还在它的申请流程中。。

具体申请流程请去OPPO开放平台找他们的人工客服获取申请方法。

3.4、VIVO

客服直接说了:不支持 & 没渠道申请

3.5、SAMSUNG

网上的方法难得的好用,但没有找到官方的回复,大家凑活用吧

    private void setSAMSUNGIconBadgeNum(int count) throws Exception {
        final Context context = App.getInstance().getBaseContext();
        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", CappUtils.getLaunchIntentForPackage());
        context.sendBroadcast(intent);
    }

3.6、MEIZU

不支持

3.7、google

Android8.0开始支持了,但没有那么理想的效果,只能在图标上显示一个
长按这个点,能弹出一个小pop告诉你有多少消息。

    private void setGoogleIconBadgeNum(int count) throws Exception {
        final Context context = App.getInstance().getBaseContext();
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
            throw new Exception(ERROR_LAUNCHER_NOT_SUPPORT_ + "Google");
        }
        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", CappUtils.getLaunchIntentForPackage()); // com.test. badge.MainActivity is your apk main activity

        context.sendBroadcast(intent);
    }

四、吐槽

4.1、

当碰到这个问题时,我因为没找到合适的砖,就去了github,结果也差不多。

最后没办法只能反编译某个通信软件的代码瞅瞅,它是咋干的。

打开后看着似曾相识的代码,才发现和我从github上看的都一样。。。

  • 比如小米的方法,在反编译的源码中并不需要我在3.2中写的那么多限制,但为啥它就能开心的玩呢?因为它是*信!

4.2、

抱着疑问的态度我不得不和手机厂商客服联系了,我首先就找了VIVO

客服妹子回答的比较干脆:不支持、没渠道申请

为啥那个什么信能行?

  • 你要是有它的用户量,VIVO会主动支持你的(这句话是我自己想的)

4.3、各厂家客服

我确实看出来某星在中国的业务不太好了,没有人工客服渠道,发的邮件如石沉大海。。
HUAWEI没的说,提了工单,周末也能及时回复。
O、V两家人工都挺热情的,就是邮件有点慢
一加的客服很热情,但因为是技术问题,所以她推荐我发邮件咨询。发邮件的结果“拒收

猜你喜欢

转载自blog.csdn.net/weixin_42976236/article/details/81704627