package com.yckj.ycsafehelper.utils;import java.lang.reflect.Field;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.os.Build;import android.widget.Toast;public class BadgeUtil {/** * Set badge count * 针对 Samsung / xiaomi / sony 手机有效 *  * @param context *            The context of the application package. * @param count *            Badge count to be set */public static void setBadgeCount(Context context, int count) {if (count <= 0) {count = 0;} else {count = Math.max(0, Math.min(count, 99));}if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) {sendToXiaoMi(context, count);} else if (Build.MANUFACTURER.equalsIgnoreCase("sony")) {sendToSony(context, count);} else if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {sendToSamsumg(context, count);} else {Toast.makeText(context, "Not Support", Toast.LENGTH_LONG).show();}}/** * 向小米手机发送未读消息数广播 *  * @param count */private static void sendToXiaoMi(Context context, int count) {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)); // 设置信息数-->这种发送必须是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));context.sendBroadcast(localIntent);}}/** * 向索尼手机发送未读消息数广播 * 据说:需添加权限:<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));// 数字localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME",context.getPackageName());// 包名context.sendBroadcast(localIntent);}/** * 向三星手机发送未读消息数广播 *  * @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);}/** * 重置、清除Badge未读显示数 *  * @param context */public static void resetBadgeCount(Context context) {setBadgeCount(context, 0);}/** * Retrieve launcher activity name of the application from the context *  * @param context *            The context of the application package. * @return launcher activity name of this application. From the *         "android:name" attribute. */private static String getLauncherClassName(Context context) {PackageManager packageManager = context.getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN);// To limit the components this Intent will resolve to, by setting an// explicit package name.intent.setPackage(context.getPackageName());intent.addCategory(Intent.CATEGORY_LAUNCHER);// All Application must have 1 Activity at least.// Launcher activity must be found!ResolveInfo info = packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY);// get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER// if there is no Activity which has filtered by CATEGORY_DEFAULTif (info == null) {info = packageManager.resolveActivity(intent, 0);}return info.activityInfo.name;}}</uses-permission>

更多相关文章

  1. Android消息机制
  2. Android:BroadcastReceiver
  3. Android面试6家一线大厂,这个问题是必问!
  4. 【Android】源码分析 - Handler消息机制再梳理
  5. Android(安卓)Handler 线程消息机制
  6. Android开发中Message, MessageQueue, looper, handler, Handler
  7. Android底部弹出iOS7风格对话选项框
  8. Android(安卓)深入了解 Handler 和 Looper
  9. 曼妙琳珑心 Android(安卓)面试题(2)

随机推荐

  1. Android 经历过的坑
  2. android 重启自身app
  3. android之PendingIntent使用
  4. Android写文件到SDCard的简单代码
  5. Android(安卓)AOSP 环境下实现C++直接调
  6. 不让EditTextView获取焦点
  7. flutter混编集成jitsi meet的记录
  8. Augmented Reality on Android: Using GP
  9. android分页查询获取系统联系人信息
  10. adb最新版下载地址