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

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

作者: MissPSTime | 来源:发表于2019-03-14 15:03 被阅读0次

    /**

     *

     */

    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不支持

    相关文章

      网友评论

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

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