桌面ICON的红图标

       桌面ICON的数字图标来Android原生系统是不支持应用桌面角标(BadgeNumber)显示的。我们目前看到的能支持应用桌面角标显示的Android系统,都是第三方厂商自己定制的。通过实现一套自己的launcher并且提供外部接口给第三方应用来调用即可

目前适配的机型有华为、三星

1.华为手机

先在manifest配置如下权限

<!-- 设置华为角标的显示 -->
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />

调用方法

/**
 * 设置华为手机的icon数字图标
 *
 * @param mContext
 * @param num
 */
private static void setHuaWeiBadgeNum(Context mContext, int num) {
    try {
        String pname = mContext.getPackageName();
        String launchClass = mContext.getPackageManager().getLaunchIntentForPackage(pname).getComponent().getClassName();
        Bundle bunlde = new Bundle();
        bunlde.putString("package", pname);
        bunlde.putString("class", launchClass);
        bunlde.putInt("badgenumber", num);
        mContext.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde);
    } catch (Exception e) {
        MyLog.e(e);
    }
}

2.三星手机

先在manifest配置如下权限

<!-- 设置三星角标的显示 -->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />

调用方法

/**
 * 设置三星手机的icon数字图标
 *
 * @param mContext
 * @param num
 */
private static void setSamSungBadgeNum(Context mContext, int num) {
    try {
        String pname = mContext.getPackageName();
        String launchClass = mContext.getPackageManager().getLaunchIntentForPackage(pname).getComponent().getClassName();
        Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        intent.putExtra("badge_count", num);
        intent.putExtra("badge_count_package_name", pname);
        intent.putExtra("badge_count_class_name", launchClass);
        mContext.sendBroadcast(intent);
    } catch (Exception e) {
        MyLog.e(e);
    }

3.OPPO

public static void setBadgeNumber(Context context, int number) {
    try {
        if (number == 0) {
            number = -1;
        }
        Intent intent = new Intent("com.oppo.unsettledevent");
        intent.putExtra("pakeageName", context.getPackageName());
        intent.putExtra("number", number);
        intent.putExtra("upgradeNumber", number);
        if (canResolveBroadcast(context, intent)) {
            context.sendBroadcast(intent);
        } else {
            try {
                Bundle extras = new Bundle();
                extras.putInt("app_badge_count", number);
                context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static boolean canResolveBroadcast(Context context, Intent intent) {
    PackageManager packageManager = context.getPackageManager();
    List<ResolveInfo> receivers = packageManager.queryBroadcastReceivers(intent, 0);
    return receivers != null && receivers.size() > 0;
}

4.VIVO

public static void setBadgeNumber(Context context, int number) {
        try {
            Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
            intent.putExtra("packageName", context.getPackageName());
            String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
            intent.putExtra("className", launchClassName);
            intent.putExtra("notificationNum", number);
            context.sendBroadcast(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.小米:

小米的设置应用角标方式比较有个性,跟其他厂商的不太一样,是跟Notification绑定在一起的。而且小米系统还有个比较特殊的地方,如果在应用内直接调用设置角标的方法,设置角标会不生效,所以只能在应用在后台并且收到推送的情况下进行角标的设置。另外,即使你设置了角标的显示,只要用户点击应用图标进入到应用内,应用的角标就会自动消失掉,即使应用内还存在新的未读消息。所以,针对小米机型,建议在收到推送后并且进行notification的时机更新应用角标

//在调用NotificationManager.notify(notifyID, notification)这个方法之前先设置角标显示的数目

public static void setBadgeNumber(Notification notification, int number) {
        try {
            Field field = notification.getClass().getDeclaredField("extraNotification");
            Object extraNotification = field.get(notification);
            Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
            method.invoke(extraNotification, number);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值