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