美文网首页
Android App 图标Number设置

Android App 图标Number设置

作者: super小立立 | 来源:发表于2018-02-23 10:54 被阅读0次

    Android App 图标Number设置

    源码获取地址 :

    https://github.com/beiliao-mobile/BadgeNumberManager

    获取手机注册名称

    static {
        //硬件制造商
        String manufacturer = Build.MANUFACTURER;
        if (manufacturer.equalsIgnoreCase(MobileBrand.HUAWEI)) {
            IMPL = new ImplHuaWei();
        } else if (manufacturer.equalsIgnoreCase(MobileBrand.XIAOMI)) {
            IMPL = new ImplXiaoMi();
        } else if (manufacturer.equalsIgnoreCase(MobileBrand.VIVO)) {
            IMPL = new ImplVIVO();
        } else if (manufacturer.equalsIgnoreCase(MobileBrand.OPPO)) {
            IMPL = new ImplOPPO();
        } else {
            IMPL = new ImplBase();
        }
    }
    

    分别为对应的手机设置角标

    • 华为

        /**
           * 设置应用的桌面角标,已在一些华为手机上测试通过,但是无法保证在所有华为手机上都生效
           *
           * @param context context
           * @param number  角标显示的数字
           *  1. 使用 Bundle 传输数据,  
           *       包括 packageName , 当前APP 启动的Activity的className, 
           *          以及需要设置角标的个数badgenumber , 
           *      
           *  2. 使用内容观察者更新数据.
           */
          public static void setBadgeNumber(Context context, int number) {
              try {
                  if (number < 0) number = 0;
                  Bundle bundle = new Bundle();
                  bundle.putString("package", context.getPackageName());
                  String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
                  bundle.putString("class", launchClassName);
                  bundle.putInt("badgenumber", number);
                  context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bundle);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
    • VIVO

        /**
           * 设置应用的桌面角标
           *
           * @param context context
           * @param number  角标显示的数字
         *
           *  1. 使用 Intent 传输数据,  new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
           *       包括 packageName , 当前APP 启动的Activity的className, 
           *        以及需要设置角标的个数 notificationNum , 
           *      
           *  2. 使用广播将 intent 发送出去.
           */
      
          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();
              }
          }  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();
              }
          }
      
    • OPPO

      /**
       * 设置应用的桌面角标
        *
        * @param context context
        * @param number  角标显示的数字
        *
        *  1. 使用 Intent 传输数据,  new Intent("com.oppo.unsettledevent");
        *     
        *      以及需要设置角标的个数 number /  upgradeNumber, 
        *      通过检查是否配置了对应的广播接受者,来考虑使用广播发送数据,
        *       和使用对应的内容提供者发送数据, 包含对应的count.
        *      
        *  2. 使用广播将 intent 发送出去.
        */    
      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 th) {
                          Log.e("OPPO" + " Badge error", "unable to resolve intent: " + intent.toString());
                      }
                  }
      
              } catch (Exception e) {
                  e.printStackTrace();
                  Log.e("OPPO" + " Badge error", "set Badge failed");
              }
          }
      
          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;
          }
      
    • XIAOMI

      /**
       * 单独对小米进行设置.
       * 
       */
      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();
          }
      }
      
    • 设置角标函数.
    private void setXiaomiBadgeNumber() {
            NotificationManager notificationManager = (NotificationManager) MainActivity.this.
                    getSystemService(Context.NOTIFICATION_SERVICE);
            Notification notification = new NotificationCompat.Builder(MainActivity.this)
                    .setSmallIcon(MainActivity.this.getApplicationInfo().icon)
                    .setWhen(System.currentTimeMillis())
                    .setContentTitle("推送标题")
                    .setContentText("我是推送内容")
                    .setTicker("ticker")
                    .setAutoCancel(true)
                    .build();
            //相邻的两次角标设置如果数字相同的话,好像下一次会不生效
            BadgeNumberManagerXiaoMi.setBadgeNumber(notification,mCount++);
            notificationManager.notify(1000, notification);
            Toast.makeText(MainActivity.this, "设置桌面角标成功", Toast.LENGTH_SHORT).show();
    
        }
    
    //设置角标 (小米除外)
    BadgeNumberManager.from(MainActivity.this).setBadgeNumber(0);
    //清除角标
    BadgeNumberManager.from(MainActivity.this).setBadgeNumber(0);
    

    相关文章

      网友评论

          本文标题:Android App 图标Number设置

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