在小米 三星 索尼 手机 :图标上显示数字

在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。

小米已经测试通过了,

三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),

测试一下,可以在回复一下测试结果,谢谢

1.原生系统(原生的Launcher ),只能修改快捷方式,增加和删除都会有toast提示

2.小米 三星  索尼 手机: 自定义的launcher:  发送显示未读消息数的action已经不同了。具体可以去看代码。。。

判断手机的代码:

/***
          * 在应用图标的快捷方式上加数字
          * @param clazz 启动的activity
          * @param isShowNum 是否显示数字
          * @param num 显示的数字:整型
          * @param isStroke 是否加上边框
          *
          */
        public static void addNumShortCut(Context context,Class<?> clazz,boolean isShowNum, String num, boolean isStroke)
          {
                 Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
            if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
                    //小米
              xiaoMiShortCut(context, clazz, num);

            }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
                    //三星
                    samsungShortCut(context, num);

            }else {//其他原生系统手机
                    installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
            }

          }

下面写好的工具类,上面的方法也在其中。

/***
 * 应用的快捷方式工具类
 *
 * @author yang
 *
 */
public class AppShortCutUtil {

        private static final String TAG = "AppShortCutUtil";

        //默认圆角半径
        private static final int DEFAULT_CORNER_RADIUS_DIP = 8;
        //默认边框宽度
        private static final int DEFAULT_STROKE_WIDTH_DIP = 2;
        //边框的颜色
        private static final int DEFAULT_STROKE_COLOR = Color.WHITE;
        //中间数字的颜色
        private static final int DEFAULT_NUM_COLOR = Color.parseColor("#CCFF0000");

        /***
         *
         * 生成有数字的图片(没有边框)
         * @param context
         * @param icon 图片
         * @param isShowNum 是否要绘制数字
         * @param num 数字字符串:整型数字 超过99,显示为"99+"
         * @return
         */
        public static Bitmap generatorNumIcon(Context context, Bitmap icon, boolean isShowNum, String num) {

                DisplayMetrics dm = context.getResources().getDisplayMetrics();
                //基准屏幕密度
                float baseDensity = 1.5f;//240dpi
                float factor = dm.density/baseDensity;

                Log.e(TAG, "density:"+dm.density);
                Log.e(TAG, "dpi:"+dm.densityDpi);
                Log.e(TAG, "factor:"+factor);

                // 初始化画布
                int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
                Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
                Canvas canvas = new Canvas(numIcon);

                // 拷贝图片
                Paint iconPaint = new Paint();
                iconPaint.setDither(true);// 防抖动
                iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
                Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
                Rect dst = new Rect(0, 0, iconSize, iconSize);
                canvas.drawBitmap(icon, src, dst, iconPaint);

                if(isShowNum){

                        if(TextUtils.isEmpty(num)){
                                num = "0";
                        }

                        if(!TextUtils.isDigitsOnly(num)){
                                //非数字
                                Log.e(TAG, "the num is not digit :"+ num);
                                num = "0";
                        }

                        int numInt = Integer.valueOf(num);

                        if(numInt > 99){//超过99

                                num = "99+";

                                // 启用抗锯齿和使用设备的文本字体大小
                                Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                                numPaint.setColor(Color.WHITE);
                                numPaint.setTextSize(20f*factor);
                                numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                                int textWidth=(int)numPaint.measureText(num, 0, num.length());

                                Log.e(TAG, "text width:"+textWidth);

                                int circleCenter = (int) (15*factor);//中心坐标
                                int circleRadius = (int) (13*factor);//圆的半径

                                //绘制左边的圆形
                                Paint leftCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                                leftCirPaint.setColor(Color.RED);
                                canvas.drawCircle(iconSize-circleRadius-textWidth+(10*factor), circleCenter, circleRadius, leftCirPaint);

                                //绘制右边的圆形
                                Paint rightCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                                rightCirPaint.setColor(Color.RED);
                                canvas.drawCircle(iconSize-circleRadius, circleCenter, circleRadius, rightCirPaint);

                                //绘制中间的距形
                                Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                                rectPaint.setColor(Color.RED);
                                RectF oval = new RectF(iconSize-circleRadius-textWidth+(10*factor), 2*factor, iconSize-circleRadius, circleRadius*2+2*factor);
                                canvas.drawRect(oval, rectPaint);

                                //绘制数字
                                canvas.drawText(num, (float)(iconSize-textWidth/2-(24*factor)), 23*factor,        numPaint);

                        }else{//<=99

                                // 启用抗锯齿和使用设备的文本字体大小
                                Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                                numPaint.setColor(Color.WHITE);
                                numPaint.setTextSize(20f*factor);
                                numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                                int textWidth=(int)numPaint.measureText(num, 0, num.length());

                                Log.e(TAG, "text width:"+textWidth);

                                //绘制外面的圆形
                                //Paint outCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                                //outCirPaint.setColor(Color.WHITE);
                                //canvas.drawCircle(iconSize - 15, 15, 15, outCirPaint);

                                //绘制内部的圆形
                                Paint inCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
                                inCirPaint.setColor(Color.RED);
                                canvas.drawCircle(iconSize-15*factor, 15*factor, 15*factor, inCirPaint);

                                //绘制数字
                                canvas.drawText(num, (float)(iconSize-textWidth/2-15*factor), 22*factor, numPaint);
                        }
                }
                return numIcon;
        }

        /***
         *
         * 生成有数字的图片(没有边框)
         * @param context
         * @param icon 图片
         * @param isShowNum 是否要绘制数字
         * @param num 数字字符串:整型数字 超过99,显示为"99+"
         * @return
         */
        public static Bitmap generatorNumIcon2(Context context, Bitmap icon, boolean isShowNum, String num) {

                DisplayMetrics dm = context.getResources().getDisplayMetrics();
                //基准屏幕密度
                float baseDensity = 1.5f;//240dpi
                float factor = dm.density/baseDensity;

                Log.e(TAG, "density:"+dm.density);
                Log.e(TAG, "dpi:"+dm.densityDpi);
                Log.e(TAG, "factor:"+factor);

                // 初始化画布
                int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
                Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
                Canvas canvas = new Canvas(numIcon);

                // 拷贝图片
                Paint iconPaint = new Paint();
                iconPaint.setDither(true);// 防抖动
                iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
                Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
                Rect dst = new Rect(0, 0, iconSize, iconSize);
                canvas.drawBitmap(icon, src, dst, iconPaint);

                if(isShowNum){

                        if(TextUtils.isEmpty(num)){
                                num = "0";
                        }

                        if(!TextUtils.isDigitsOnly(num)){
                                //非数字
                                Log.e(TAG, "the num is not digit :"+ num);
                                num = "0";
                        }

                        int numInt = Integer.valueOf(num);

                        if(numInt > 99){//超过99
                                num = "99+";
                        }

                        //启用抗锯齿和使用设备的文本字体大小
                        //测量文本占用的宽度
                        Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                        numPaint.setColor(Color.WHITE);
                        numPaint.setTextSize(20f*factor);
                        numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                        int textWidth=(int)numPaint.measureText(num, 0, num.length());
                        Log.e(TAG, "text width:"+textWidth);

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景 start
                         *------------------------------------*/
                        //圆角矩形背景的宽度
                        int backgroundHeight = (int) (2*15*factor);
                        int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;

                        canvas.save();//保存状态

                        ShapeDrawable drawable = getDefaultBackground(context);
                        drawable.setIntrinsicHeight(backgroundHeight);
                        drawable.setIntrinsicWidth(backgroundWidth);
                        drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
                        canvas.translate(iconSize-backgroundWidth, 0);
                        drawable.draw(canvas);

                        canvas.restore();//重置为之前保存的状态

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景 end
                         *------------------------------------*/

                        //绘制数字
                        canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth)/2), 22*factor, numPaint);
                }
                return numIcon;
        }
        /***
         *
         * 生成有数字的图片(有边框)
         * @param context
         * @param icon 图片
         * @param isShowNum 是否要绘制数字
         * @param num 数字字符串:整型数字 超过99,显示为"99+"
         * @return
         */
        public static Bitmap generatorNumIcon3(Context context, Bitmap icon, boolean isShowNum, String num) {

                DisplayMetrics dm = context.getResources().getDisplayMetrics();
                //基准屏幕密度
                float baseDensity = 1.5f;//240dpi
                float factor = dm.density/baseDensity;

                Log.e(TAG, "density:"+dm.density);
                Log.e(TAG, "dpi:"+dm.densityDpi);
                Log.e(TAG, "factor:"+factor);

                // 初始化画布
                int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
                Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
                Canvas canvas = new Canvas(numIcon);

                // 拷贝图片
                Paint iconPaint = new Paint();
                iconPaint.setDither(true);// 防抖动
                iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
                Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
                Rect dst = new Rect(0, 0, iconSize, iconSize);
                canvas.drawBitmap(icon, src, dst, iconPaint);

                if(isShowNum){

                        if(TextUtils.isEmpty(num)){
                                num = "0";
                        }

                        if(!TextUtils.isDigitsOnly(num)){
                                //非数字
                                Log.e(TAG, "the num is not digit :"+ num);
                                num = "0";
                        }

                        int numInt = Integer.valueOf(num);

                        if(numInt > 99){//超过99
                                num = "99+";
                        }

                        //启用抗锯齿和使用设备的文本字体大小
                        //测量文本占用的宽度
                        Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                        numPaint.setColor(Color.WHITE);
                        numPaint.setTextSize(20f*factor);
                        numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                        int textWidth=(int)numPaint.measureText(num, 0, num.length());
                        Log.e(TAG, "text width:"+textWidth);

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景:先画边框,再画内部的圆角矩形 start
                         *------------------------------------*/
                        //圆角矩形背景的宽度
                        int backgroundHeight = (int) (2*15*factor);
                        int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
                        //边框的宽度
                        int strokeThickness = (int) (2*factor);

                        canvas.save();//保存状态

                        int strokeHeight = backgroundHeight + strokeThickness*2;
                        int strokeWidth = textWidth>strokeHeight ? (int)(textWidth+ 10*factor + 2*strokeThickness) : strokeHeight;
                        ShapeDrawable outStroke = getDefaultStrokeDrawable(context);
                        outStroke.setIntrinsicHeight(strokeHeight);
                        outStroke.setIntrinsicWidth(strokeWidth);
                        outStroke.setBounds(0, 0, strokeWidth, strokeHeight);
                        canvas.translate(iconSize-strokeWidth-strokeThickness, strokeThickness);
                        outStroke.draw(canvas);

                        canvas.restore();//重置为之前保存的状态

                        canvas.save();//保存状态

                        ShapeDrawable drawable = getDefaultBackground(context);
                        drawable.setIntrinsicHeight((int) (backgroundHeight+2*factor));
                        drawable.setIntrinsicWidth((int) (backgroundWidth+2*factor));
                        drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
                        canvas.translate(iconSize-backgroundWidth-2*strokeThickness, 2*strokeThickness);
                        drawable.draw(canvas);

                        canvas.restore();//重置为之前保存的状态

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景 end
                         *------------------------------------*/

                        //绘制数字
                        canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+4*strokeThickness)/2), (22)*factor+2*strokeThickness, numPaint);
                }
                return numIcon;
        }

        /***
         *
         * 生成有数字的图片(有边框的)
         * @param context
         * @param icon 图片
         * @param isShowNum 是否要绘制数字
         * @param num 数字字符串:整型数字 超过99,显示为"99+"
         * @return
         */
        public static Bitmap generatorNumIcon4(Context context, Bitmap icon, boolean isShowNum, String num) {

                DisplayMetrics dm = context.getResources().getDisplayMetrics();
                //基准屏幕密度
                float baseDensity = 1.5f;//240dpi
                float factor = dm.density/baseDensity;

                Log.e(TAG, "density:"+dm.density);
                Log.e(TAG, "dpi:"+dm.densityDpi);
                Log.e(TAG, "factor:"+factor);

                // 初始化画布
                int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
                Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
                Canvas canvas = new Canvas(numIcon);

                // 拷贝图片
                Paint iconPaint = new Paint();
                iconPaint.setDither(true);// 防抖处理
                iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
                Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
                Rect dst = new Rect(0, 0, iconSize, iconSize);
                canvas.drawBitmap(icon, src, dst, iconPaint);

                if(isShowNum){

                        if(TextUtils.isEmpty(num)){
                                num = "0";
                        }

                        if(!TextUtils.isDigitsOnly(num)){
                                //非数字
                                Log.e(TAG, "the num is not digit :"+ num);
                                num = "0";
                        }

                        int numInt = Integer.valueOf(num);

                        if(numInt > 99){//超过99
                                num = "99+";
                        }

                        //启用抗锯齿和使用设备的文本字体
                        //测量文本占用的宽度
                        Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
                        numPaint.setColor(Color.WHITE);
                        numPaint.setTextSize(25f*factor);
                        numPaint.setTypeface(Typeface.DEFAULT_BOLD);
                        int textWidth=(int)numPaint.measureText(num, 0, num.length());
                        Log.e(TAG, "text width:"+textWidth);

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景 start
                         *------------------------------------*/
                        //边框的宽度
                        int strokeThickness = (int) (DEFAULT_STROKE_WIDTH_DIP*factor);
                        //圆角矩形背景的宽度
                        float radiusPx = 15*factor;
                        int backgroundHeight = (int) (2*(radiusPx+strokeThickness));//2*(半径+边框宽度)
                        int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth + 10*factor + 2*strokeThickness) : backgroundHeight;

                        canvas.save();//保存状态

                        ShapeDrawable drawable = getDefaultBackground2(context);
                        drawable.setIntrinsicHeight(backgroundHeight);
                        drawable.setIntrinsicWidth(backgroundWidth);
                        drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
                        canvas.translate(iconSize-backgroundWidth-strokeThickness, 2*strokeThickness);
                        drawable.draw(canvas);

                        canvas.restore();//重置为之前保存的状态

                        /**----------------------------------*
                         * TODO 绘制圆角矩形背景 end
                         *------------------------------------*/

                        //绘制数字
                        canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+2*strokeThickness)/2), (float) (25*factor+2.5*strokeThickness), numPaint);
                }
                return numIcon;
        }

        /***
         * 创建原生系统的快捷方式
         * @param context
         * @param clazz 启动的activity
         * @param isShowNum 是否显示数字
         * @param num 显示的数字:整型
         * @param isStroke 是否加上边框
         */

        public static void installRawShortCut(Context context, Class<?> clazz, boolean isShowNum, String num, boolean isStroke) {
                Log.e(TAG, "installShortCut....");

                Intent shortcutIntent = new Intent(        "com.android.launcher.action.INSTALL_SHORTCUT");
                //名称
                shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,        context.getString(R.string.app_name));

                // 是否可以有多个快捷方式的副本,参数如果是true就可以生成多个快捷方式,如果是false就不会重复添加
                shortcutIntent.putExtra("duplicate", false);

                //点击快捷方式:打开activity
                Intent mainIntent = new Intent(Intent.ACTION_MAIN);
                mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                mainIntent.setClass(context, clazz);
                shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mainIntent);

                //快捷方式的图标
                if(isStroke){
                        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
                                        generatorNumIcon4(
                                                        context,
                                                        ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
                                                        isShowNum,
                                                        num));
                }else{
                        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
                                        generatorNumIcon2(
                                                        context,
                                                        ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
                                                        isShowNum,
                                                        num));
                }
                context.sendBroadcast(shortcutIntent);
        }

        /***
         * 是否已经创建了快捷方式
         * @param context
         * @return
         */
        public static boolean isAddShortCut(Context context) {
                  Log.e(TAG, "isAddShortCut....");

            boolean isInstallShortcut = false;
            final ContentResolver cr = context.getContentResolver();

            //TODO 注释的代码,在有的手机:修改了ROM的系统,不能支持
            /*int versionLevel = android.os.Build.VERSION.SDK_INT;
                        String AUTHORITY = "com.android.launcher2.settings";
                        //2.2以上的系统的文件文件名字是不一样的
                        if (versionLevel >= 8) {
                            AUTHORITY = "com.android.launcher2.settings";
                        } else {
                            AUTHORITY = "com.android.launcher.settings";
                        }*/

                String AUTHORITY = getAuthorityFromPermission(context, "com.android.launcher.permission.READ_SETTINGS");
                Log.e(TAG, "AUTHORITY  :  " +AUTHORITY);
                final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
                + "/favorites?notify=true");

                Cursor c = cr.query(CONTENT_URI,
                        new String[] { "title" }, "title=?",
                        new String[] { context.getString(R.string.app_name) }, null);

                if (c != null && c.getCount() > 0) {
                    isInstallShortcut = true;
                }

                if(c != null){
                        c.close();
                }

                Log.e(TAG, "isAddShortCut....isInstallShortcut="+isInstallShortcut);

            return isInstallShortcut;
        }

        /**
         * 删除快捷方式
         * @param context
         * @param clazz
         */
         public static void deleteShortCut(Context context, Class<?> clazz){
                 Log.e(TAG, "delShortcut....");

                 if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
                        //小米
                        //当为""时,不显示数字,相当于隐藏了)
                        xiaoMiShortCut(context, clazz, "");

                }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
                        //三星
                        samsungShortCut(context, "0");

                }else {//其他原生系统手机
                        //删除显示数字的快捷方式
                        deleteRawShortCut(context, clazz);
                        //安装不显示数字的快捷方式
                        //installRawShortCut(context, clazz, false, "0");
                }
         }

        /***
         * 删除原生系统的快捷方式
         * @param context
         * @param clazz 启动的activity
         */
        public static void deleteRawShortCut(Context context, Class<?> clazz) {
                Intent intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
                //快捷方式的名称
                intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.app_name));

                Intent intent2 = new Intent();
                intent2.setClass(context, clazz);
                intent2.setAction(Intent.ACTION_MAIN);
                intent2.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent2); 

                context.sendBroadcast(intent);
        }

          /***
         * 取得权限相应的认证URI
         * @param context
         * @param permission
         * @return
         */
        public static String getAuthorityFromPermission(Context context, String permission) {
                if (TextUtils.isEmpty(permission)) {
                        return null;
                }
                List<PackageInfo> packInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
                if (packInfos == null) {
                        return null;
                }
                for (PackageInfo info : packInfos) {
                        ProviderInfo[] providers = info.providers;
                        if (providers != null) {
                                for (ProviderInfo provider : providers) {
                                        if (permission.equals(provider.readPermission)
                                                        || permission.equals(provider.writePermission)) {
                                                return provider.authority;
                                        }
                                }
                        }
                }
                return null;
        }

        /***
         * 在小米应用图标的快捷方式上加数字<br>
         *
         *
         * @param context
         * @param num 显示的数字:大于99,为"99",当为""时,不显示数字,相当于隐藏了)<br><br>
         *
         * 注意点:
         * context.getPackageName()+"/."+clazz.getSimpleName() (这个是启动activity的路径)中的"/."不能缺少
         *
         */
        public static void xiaoMiShortCut(Context context,Class<?> clazz, String num)
          {
                Log.e(TAG, "xiaoMiShortCut....");
                Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
                localIntent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName()+"/."+clazz.getSimpleName());
                if(TextUtils.isEmpty(num)){
                        num = "";
                }else{
                    int numInt = Integer.valueOf(num);
                    if (numInt > 0){
                          if (numInt > 99){
                                num = "99";
                      }
                    }else{
                            num = "0";
                    }
                }
                localIntent.putExtra("android.intent.extra.update_application_message_text", num);
                context.sendBroadcast(localIntent);
          }                                                                                        

         /***
          * 索尼手机:应用图标的快捷方式上加数字
          * @param context
          * @param num
          */
        public static void sonyShortCut(Context context, String num)
          {
            String activityName = getLaunchActivityName(context);
            if (activityName == null){
              return;
            }
            Intent localIntent = new Intent();
            int numInt = Integer.valueOf(num);
            boolean isShow = true;
            if (numInt < 1){
              num = "";
              isShow = false;
            }else if (numInt > 99){
                    num = "99";
            }
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);
            localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", activityName);
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", num);
            localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
            context.sendBroadcast(localIntent);
          }

         /***
          * 三星手机:应用图标的快捷方式上加数字
          * @param context
          * @param num
          */
        public static void samsungShortCut(Context context, String num)
         {
                int numInt = Integer.valueOf(num);
            if (numInt < 1)
            {
              num = "0";
            }else if (numInt > 99){
                    num = "99";
            }
                 String activityName = getLaunchActivityName(context);
            Intent localIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
            localIntent.putExtra("badge_count", num);
            localIntent.putExtra("badge_count_package_name", context.getPackageName());
            localIntent.putExtra("badge_count_class_name", activityName);
            context.sendBroadcast(localIntent);
         }

         /***
          * 在应用图标的快捷方式上加数字
          * @param clazz 启动的activity
          * @param isShowNum 是否显示数字
          * @param num 显示的数字:整型
          * @param isStroke 是否加上边框
          *
          */
        public static void addNumShortCut(Context context,Class<?> clazz,boolean isShowNum, String num, boolean isStroke)
          {
                 Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
            if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
                    //小米
              xiaoMiShortCut(context, clazz, num);

            }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
                    //三星
                    samsungShortCut(context, num);

            }else {//其他原生系统手机
                    installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
            }

          }

         /***
          * 取得当前应用的启动activity的名称:
          * mainfest.xml中配置的 android:name:"
          * @param context
          * @return
          */
        public static String getLaunchActivityName(Context context)
         {
            PackageManager localPackageManager = context.getPackageManager();
            Intent localIntent = new Intent("android.intent.action.MAIN");
            localIntent.addCategory("android.intent.category.LAUNCHER");
            try
            {
              Iterator<ResolveInfo> localIterator = localPackageManager.queryIntentActivities(localIntent, 0).iterator();
              while (localIterator.hasNext())
              {
                ResolveInfo localResolveInfo = localIterator.next();
                if (!localResolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(context.getPackageName()))
                  continue;
                String str = localResolveInfo.activityInfo.name;
                return str;
              }
            }
            catch (Exception localException)
            {
              return null;
            }
            return null;
         }

        /***
         * 得到一个默认的背景:圆角矩形<br><br>
         * 使用代码来生成一个背景:相当于用<shape>的xml的背景
         *
         * @return
         */
        private static ShapeDrawable getDefaultBackground(Context context) {

                //这个是为了应对不同分辨率的手机,屏幕兼容性
                int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
                float[] outerR = new float[] {r, r, r, r, r, r, r, r};

                //圆角矩形
                RoundRectShape rr = new RoundRectShape(outerR, null, null);
                ShapeDrawable drawable = new ShapeDrawable(rr);
                drawable.getPaint().setColor(DEFAULT_NUM_COLOR);//设置颜色
                return drawable;

        }
        /***
         * 得到一个默认的背景:圆角矩形<br><br>
         * 使用代码来生成一个背景:相当于用<shape>的xml的背景
         *
         * @return
         */
        private static ShapeDrawable getDefaultBackground2(Context context) {

                //这个是为了应对不同分辨率的手机,屏幕兼容性
                int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
                float[] outerR = new float[] {r, r, r, r, r, r, r, r};
                int distance = dipToPixels(context,DEFAULT_STROKE_WIDTH_DIP);

                //圆角矩形
                RoundRectShape rr = new RoundRectShape(outerR, null, null);
                customBorderDrawable drawable = new customBorderDrawable(context,rr);
                drawable.getFillpaint().setColor(DEFAULT_NUM_COLOR);//设置填充颜色
                drawable.getStrokepaint().setColor(DEFAULT_STROKE_COLOR);//设置边框颜色
                drawable.getStrokepaint().setStrokeWidth(distance);//设置边框宽度
                return drawable;

        }

        /***
         * 得到一个默认的背景:圆角矩形<br><br>
         * 使用代码来生成一个背景:相当于用<shape>的xml的背景
         *
         * @return
         */
        private static ShapeDrawable getDefaultStrokeDrawable(Context context) {

                //这个是为了应对不同分辨率的手机,屏幕兼容性
                int r = dipToPixels(context, DEFAULT_CORNER_RADIUS_DIP);
                int distance = dipToPixels(context, DEFAULT_STROKE_WIDTH_DIP);
                float[] outerR = new float[] {r, r, r, r, r, r, r, r};

                //圆角矩形
                RoundRectShape rr = new RoundRectShape(outerR, null, null);
                ShapeDrawable drawable = new ShapeDrawable(rr);
                drawable.getPaint().setStrokeWidth(distance);
                drawable.getPaint().setStyle(Paint.Style.FILL);
                drawable.getPaint().setColor(DEFAULT_STROKE_COLOR);//设置颜色
                return drawable;
        }

        /***
         * dp to px
         * @param dip
         * @return
         */
        public static int dipToPixels(Context context, int dip) {
                Resources r = context.getResources();
                float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, r.getDisplayMetrics());
                return (int) px;
        }
}
时间: 2024-10-06 14:33:09

在小米 三星 索尼 手机 :图标上显示数字的相关文章

delphi在手机桌面图标上显示数字

function getLauncherClassName: JString; var str : JString; localPackageManager : JPackageManager; Intent: JIntent; localIterator : JIterator; localResolveInfo : JResolveInfo; begin localPackageManager := SharedActivity.getPackageManager; Intent := TJ

[收集]在iPhone桌面的应用程序图标右上角显示数字

能够在ios桌面的程序icon右上角显示数字(badge number)的方法 在ViewController中的viewDidLoad方法中添加如下代码即可 - (void)viewDidLoad { [super viewDidLoad]; [UIApplication sharedApplication].applicationIconBadgeNumber = 2; } [收集]在iPhone桌面的应用程序图标右上角显示数字,布布扣,bubuko.com

Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

摘要 Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差. BadgeNumber ShortCutNumber miui samsung sony sendBadgeNumber logo/icon数字提醒 Android系统 小米,三星,索尼

Android系统 小米/三星/索尼快键图标BadgeNumber数字提醒

Android系统 小米,三星,索尼手机发送桌面快键提醒数字图标,在Android系统中,众所周知不支持BadgeNumber,虽然第三方控件BadgeView可以实现应用内的数字提醒,但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但这种方式天生弊端,实用性很差. 我们现在来实现桌面logo或者说icon右上角的图标,先来看2张图,第一张来自互联网,第二张来自个人实践!(由于实验条件youxia)     好了,上代码 public class Main

iOS开发——应用图标上显示消息数量

iOS8以前: UIApplication *app = [UIApplication sharedApplication]; app.applicationIconBadgeNumber = num; iOS8及以后: UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; [[UIApplic

JavaScript 在页面上显示数字时钟

显示一个钟表 <html> <head> <script type="text/javascript"> function startTime() { var today=new Date() var h=today.getHours() var m=today.getMinutes() var s=today.getSeconds() // add a zero in front of numbers<10 m=checkTime(m) s=

Xamarin Android 应用程序内图标上数字提示

最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法,欢迎分享. 类似推特客户端的新消息提醒 解决思路:把图标和数字提示文本放在 RelativeLayout 或 FrameLayout 内,把文本放在右上角. 实现代码: 新建一个 Xamain Android 项目,打天 Main.axml 文件,首先添加一下 Toolbar,<android.su

百度手机助手上传应用,360助手上架app,豌豆荚发布app多少钱

百度手机助手上传应用,360助手上架app,豌豆荚发布app多少钱 QQ 2205357007 对于安卓App推广而言,申请应用市场App首发是比较有效的App推广方式.如何申请App首发?选择独家App首发还是联合App首发,都需要根据实际情况综合考虑. 目前比较有效的App首发市场包括:360手机助手.腾讯应用宝.百度手机助手.小米.华为.魅族.OPPO,当然有余力的情况下,也可以去申请相对小众的应用市场比如豌豆荚.安智.淘宝手机助手.联想.搜狗.机锋.VIVO.金立等,下面泽思为大家介绍各

某项目 需要在UITabbar 上显示小红点,在此搜罗了三个方法。

1.使用系统自带的,并且可以在小红点上显示数字. [itemOne setBadgeValue:@""]; //显示不带数字的小红点 [itemOne setBadgeValue:@"1"];//显示小红点 并且带数字 以上的缺点:小红点太大了,伤不起啊! 2.使用图片,创建图片的时候,设置图片的渲染. UIImage * normalImage = [[UIImage imageNamed:@"pic_msg_yes_nor"] imageWi