Android 桌面角标的适配

作者: 黑泥卡 | 来源:发表于2016-12-28 18:30 被阅读3777次

    一个本不该存在在 android 系统中的功能。

    为什么这么说呢?google从来没有在android系统中设计这个功能。本人也非常不喜欢这么做。。。
    原本就有通知栏提醒的情况下,何必重复添加一个提醒。尤其对强迫症患者来说,一些无关紧要的提醒
    却让桌面图标上多了一个数字,而且根本不知道这个数字想告诉你什么,简直不能忍。直接看顶部的通
    知多好啊!
    既然一些(好吧,大部分)厂家,非要效仿ios,那肯定会有用户提出这种需求了。但是要怎么做呢?
    google的文档上坑定是没有了。只能去各个公司的开发着平台上找了。。。
    Ps: 今年的开发者大会上还有人问了这个问题。回答是:android一直都在变,他也不知道将来会是什
    么样子。

    ShortcutBadger:

    support-devices
    先推荐一个 GitHub Library: ShortcutBadger
    如上图,它集成了很多 launchers 的角标提醒。
    但是很不幸的是,图很美。现实并不是,所以如果想粗略的实现该功能,推荐使用上库。

    不得不说,整理这个的人还挺多的,又搜到一个:https://github.com/l123456789jy/Lazy/blob/master/lazylibrary/src/main/java/com/github/lazylibrary/util/BadgeUtil.java

    这些都差不多,看着用吧。

    不支持的厂商

    魅族,中兴,酷派...
    必须点赞啊,不跟风。

    华为

    华为的文档很好找,说明也很清楚,还有Demo,真是服务周到。
    文档地址:http://developer.huawei.com/consumer/cn/wiki/index.php?title=%E5%8D%8E%E4%B8%BA%E6%A1%8C%E9%9D%A2%E8%A7%92%E6%A0%87SDK%E4%B8%8B%E8%BD%BD
    使用方式
    manifest 中添加权限。

    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
    <uses-permission android:name="com.huawei.permission.sec.MDM"/>
    

    在代码中添加方法:

    //检测EMUI版本是否支持
    public void checkIsSupportedByVersion(){
        try {
          PackageManager manager = getPackageManager();
          PackageInfo info = manager.getPackageInfo("com.huawei.android.launcher", 0);
          if(info.versionCode>=63029){
            isSupportedBade = true;
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
    //控制显示的个数
    private void handleBadge(int num){
      if(!isSupportedBade){
        Log.i("badgedemo", "not supported badge!");
        return;
      }
      try{
        Bundle bunlde =new Bundle();
        bunlde.putString("package", "com.example.badgedemo");
        bunlde.putString("class", "com.example.badgedemo.MainActivity");
        bunlde.putInt("badgenumber",num);
        ContentResolver t=this.getContentResolver();
        Bundle result=t.call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_launcher_badge", "", bunlde);
      }catch(Exception e){
        e.printStackTrace();
      }
    }
    

    小米

    文档地址
    小米还算良心,文档比较好找。

    基本介绍

    默认的情况
    当app 向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面app icon角标就会显示1.
    此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。
    通知可以定义角标数
    例如 有5封未读邮件,通知栏里只会显示一条通知,但是想让角标显示5. 可以在发通知时加个标示。
    实现代码

    第三方app需要用反射来调用,参考代码:

    
    NotificationManager mNotificationManager = (NotificationManager) this
    
    .getSystemService(Context.NOTIFICATION_SERVICE);
    
    
    
    Notification.Builder builder = new Notification.Builder(this)
    
    .setContentTitle(“title”).setContentText(“text”).setSmallIcon(R.drawable.icon);
    
    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, mCount);
    
    } catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    mNotificationManager.notify(0,notification);
    

    三星

    官方只找到了应用商店上传应用的一些文档和主题文档
    算了,高手在民间吧。
    额,我又犯了一个错误。我先用的是google中文的搜索。。。

    中文 英文
    chinese.png english.png

    先看看中文搜索结果

    中文找到了:找到了简书这篇Badge分析&如何逼死处女座
    以下方法转自那篇简书文章:

    方法一

    通过三星Launcher自己的广播,来给应用添加角标:

    /**
     * 设置三星的Badge
     *
     * @param context context
     * @param count   count
     */
    private static void setBadgeOfSumsung(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);
    }
    

    此方法不需要任何权限,只需要知道App的包名和类名。因此,你当然可以在程序里面给其它任意一个App设置任意数量的角标,
    而且没有任何提示,是的,很流氓,谁说不是呢,当然别说是我告诉你的,你就所你是百度的。例如:

    intent.putExtra("badge_count_package_name", "com.tencent.mobileqq");
    intent.putExtra("badge_count_class_name", "com.tencent.mobileqq.activity.SplashActivity");
    将包名和类名用QQ的替换下,然后你就可以随心所欲、为所欲为了。

    方法二

    https://github.com/shafty023/SamsungBadger
    三年前更新的,不知道还能用不。。。

    再看看英文吧

    点开第一个stackoverflow
    点赞最多的答案:
    First you'll need to add the following permissions to your AndroidManifest.xml file.

    <uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
    <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
    

    The column structure is as follows:

    (integer) _id, (text) package, (text) class, (integer) badgecount, (blob) icon, (???) extraData
    

    In order to query ALL results from the BadgeProvider do the following:

    // This is the content uri for the BadgeProvider
    Uri uri = Uri.parse("content://com.sec.badge/apps");
    
    Cursor c = getContentResolver().query(uri, null, null, null, null);
    
    // This indicates the provider doesn't exist and you probably aren't running
    // on a Samsung phone running TWLauncher. This has to be outside of try/finally block
    if (c == null) {
        return;
    }
    
    try {
        if (!c.moveToFirst()) {
            // No results. Nothing to query
            return;
        }
    
        c.moveToPosition(-1);
        while (c.moveToNext()) {
            String pkg = c.getString(1);
            String clazz = c.getString(2);
            int badgeCount = c.getInt(3);
            Log.d("BadgeTest", "package: " + pkg + ", class: " + clazz + ", count: " + String.valueOf(cnt));
        }
    } finally {
        c.close();
    }
    

    In order to add a badge count to your application icon

    ContentValues cv = new ContentValues();
    cv.put("package", getPackageName());
    // Name of your activity declared in the manifest as android.intent.action.MAIN.
    // Must be fully qualified name as shown below
    cv.put("class", "com.example.badge.activity.Test");
    cv.put("badgecount", 1); // integer count you want to display
    
    // Execute insert
    getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"), cv);
    

    If you want to clear the badge count on your icon

    ContentValues cv = new ContentValues();
    cv.put("badgecount", 0);
    getContentResolver().update(Uri.parse("content://com.sec.badge/apps"), cv, "package=?", new String[] {getPackageName()});  
    

    NEW
    I have created an open source project that you can import as a library to assist with this. It's licensed as Apache so feel free to use it as you please.
    You can get it from here: https://github.com/shafty023/SamsungBadger

    额,这不就是那个三年前停止更新的github的项目吗。。。。崩溃!

    点赞第二多的:
    There is another cool open source library that support different devices:
    https://github.com/leolin310148/ShortcutBadger/

    好吧,都是见过的。

    LG

    据说和 samsung 一样。

    sony

    果然大厂 google 一下就找到了。
    地址:https://developer.sony.com/2016/06/23/xperia-home-badge-api-now-publicly-available/

    oppo

    网上根本找不到相关文档。
    这种肆意模仿 apple 的公司自然有这个功能了。然而文档并没有,而且网上几乎搜不到。。。
    github:ShortcutBadger说有支持。没有测试机,没法测试啊。。。而且根本不知道他们什么时候开始支持的。
    最近在百度云测上测了一下,github:ShortcutBadger 这个项目可以。

    vivo

    网上根本找不到相关文档。
    这篇说可以,不知道行不行。没有测试机。
    http://www.lai18.com/content/9532859.html
    这一篇看起来比较靠谱:
    http://blog.csdn.net/dbs1215/article/details/53054073

    金立

    网上根本找不到相关文档。

    以上三家公司的开发者平台,结构几乎一模一样,真是佩服!

    相关文章

      网友评论

      • 99f25e72b540:三星测试机,6.0以上,清单文件也加了相关权限,有这样的报错:Caused by: java.lang.SecurityException: Permission Denial: writing com.sec.android.provider.badge.BadgeProvider uri content://com.sec.badge/apps?notify=true from pid=4044, uid=10403 requires com.sec.android.provider.badge.permission.WRITE, or grantUriPermission(),这个错是说要动态申请权限吗?但是代码里写这个权限报红
      • 30d510f59682:华为手机亲测,还要加很多的华为自定义的权限的,同时你写的代码
        Bundle result=t.call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_launcher_badge", "", bunlde);
        是有错的,change_launcher_badge要改为change_badge
      • 119bcfad5841:我的华为手机mate8怎么就不行呢?需要SDK吗? Caused by: java.lang.SecurityException: Permission Denial: opening provider com.huawei.android.launcher.LauncherProvider from ProcessRecord{4c2086f 26371:com.phone.takingdata/u0a1338} (pid=26371, uid=11338) requires com.huawei.android.launcher.permission.READ_SETTINGS or com.huawei.android.launcher.permission.WRITE_SETTINGS
        99f25e72b540:请问你解决了吗?
        黑泥卡:com.huawei.android.launcher.permission.READ_SETTINGS or com.huawei.android.launcher.permission.WRITE_SETTINGS
        这两个权限加了没?
      • 37c7796cd658:您好 想问一下,,华为 的桌面角标,添加上这个权限,<uses-permission android:name="com.huawei.permission.sec.MDM"/> 应用无法安装,看了一下开发文档,必须要注册成为华为开发者,关联证书才可以吗,,求指教
        hgncxzy:@半部江湖 你好,我按照华为文档接入,还是不能显示角标,权限什么的都添加了,是不是下面这段代码写的位置不对,求指教

        Bundle extra =new Bundle();
        extra.putString("package", "xxxxxx");
        extra.putString("class", "yyyyyyy");
        extra.putInt("badgenumber", i);
        context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);
        37c7796cd658:@黑泥卡 谢谢,,我给华为 开发者客服打得电话,他们放开这个桌面角标功能了,,只需要添加 <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/> 权限就可以了
        黑泥卡:也可以不需要那个权限,使用下面的权限即可:
        <!--for huawei-->
        <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
        <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
        <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>

        参考:https://github.com/leolin310148/ShortcutBadger/blob/master/ShortcutBadger/src/main/AndroidManifest.xml
      • e33ed3368e62:你好,好像小米的只能实现一次,就不行了,这是什么原因呢?
        run_1c01:@六点的太阳 你是怎么解决的 我也发现他只能实现一次
        e33ed3368e62:@黑泥卡 嗯,谢谢
        黑泥卡:@梦开始阵痛 这是小米的文档:http://dev.xiaomi.com/doc/p=3904/index.html
        你看一下,应该没问题
      • d565f9fd1a55:作为产品狗,终于可以跟我们的运营喵说哥可以满足你了😂😂😂
        黑泥卡:@取个帅气的昵称吧j :joy:
      • 橙子掌:好厉害,解决强迫症面对的难题!
        黑泥卡: @橙子掌 我就是个强迫症患者😬

      本文标题:Android 桌面角标的适配

      本文链接:https://www.haomeiwen.com/subject/ghlyvttx.html