Android App 圖標Number設置

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  角標顯示的數(shù)字
         *  1. 使用 Bundle 傳輸數(shù)據(jù),  
         *       包括 packageName , 當前APP 啟動的Activity的className, 
         *          以及需要設置角標的個數(shù)badgenumber , 
         *      
         *  2. 使用內(nèi)容觀察者更新數(shù)據(jù).
         */
        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  角標顯示的數(shù)字
       *
         *  1. 使用 Intent 傳輸數(shù)據(jù),  new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
         *       包括 packageName , 當前APP 啟動的Activity的className, 
         *        以及需要設置角標的個數(shù) notificationNum , 
         *      
         *  2. 使用廣播將 intent 發(fā)送出去.
         */
    
        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  角標顯示的數(shù)字
      *
      *  1. 使用 Intent 傳輸數(shù)據(jù),  new Intent("com.oppo.unsettledevent");
      *     
      *      以及需要設置角標的個數(shù) number /  upgradeNumber, 
      *      通過檢查是否配置了對應的廣播接受者,來考慮使用廣播發(fā)送數(shù)據(jù),
      *       和使用對應的內(nèi)容提供者發(fā)送數(shù)據(jù), 包含對應的count.
      *      
      *  2. 使用廣播將 intent 發(fā)送出去.
      */    
    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();
        }
    }
    
  • 設置角標函數(shù).
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("我是推送內(nèi)容")
                .setTicker("ticker")
                .setAutoCancel(true)
                .build();
        //相鄰的兩次角標設置如果數(shù)字相同的話,好像下一次會不生效
        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);

?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容