在小米 三星 索尼 手机 :图标上显示数字(未读消息数)

在小米 三星  索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。
小米已经测试通过了,
三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),
测试一下,可以在回复一下测试结果,谢谢


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

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


判断手机的代码:


  1. /***
  2.           * 在应用图标的快捷方式上加数字
  3.           * @param clazz 启动的activity
  4.           * @param isShowNum 是否显示数字
  5.           * @param num 显示的数字:整型
  6.           * @param isStroke 是否加上边框
  7.           * 
  8.           */
  9.         public static void addNumShortCut(Context context,Class<?> clazz,boolean isShowNum, String num, boolean isStroke)
  10.           {
  11.                  Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
  12.             if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
  13.                     //小米
  14.               xiaoMiShortCut(context, clazz, num);
  15.               
  16.             }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
  17.                     //三星
  18.                     samsungShortCut(context, num);
  19.                     
  20.             }else {//其他原生系统手机
  21.                     installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
  22.             }
  23.             
  24.           }
复制代码
下面写好的工具类,上面的方法也在其中。



  1. /***
  2. * 应用的快捷方式工具类

  3. * @author yang

  4. */
  5. public class AppShortCutUtil {

  6.         private static final String TAG = "AppShortCutUtil";
  7.         
  8.         //默认圆角半径
  9.         private static final int DEFAULT_CORNER_RADIUS_DIP = 8;
  10.         //默认边框宽度
  11.         private static final int DEFAULT_STROKE_WIDTH_DIP = 2;
  12.         //边框的颜色
  13.         private static final int DEFAULT_STROKE_COLOR = Color.WHITE;
  14.         //中间数字的颜色
  15.         private static final int DEFAULT_NUM_COLOR = Color.parseColor("#CCFF0000");


  16.         /***
  17.          * 
  18.          * 生成有数字的图片(没有边框)
  19.          * @param context
  20.          * @param icon 图片
  21.          * @param isShowNum 是否要绘制数字
  22.          * @param num 数字字符串:整型数字 超过99,显示为"99+"
  23.          * @return
  24.          */
  25.         public static Bitmap generatorNumIcon(Context context, Bitmap icon, boolean isShowNum, String num) {
  26.                 
  27.                 DisplayMetrics dm = context.getResources().getDisplayMetrics();
  28.                 //基准屏幕密度
  29.                 float baseDensity = 1.5f;//240dpi
  30.                 float factor = dm.density/baseDensity;
  31.                 
  32.                 Log.e(TAG, "density:"+dm.density);
  33.                 Log.e(TAG, "dpi:"+dm.densityDpi);
  34.                 Log.e(TAG, "factor:"+factor);
  35.                 
  36.                 // 初始化画布
  37.                 int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
  38.                 Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
  39.                 Canvas canvas = new Canvas(numIcon);

  40.                 // 拷贝图片
  41.                 Paint iconPaint = new Paint();
  42.                 iconPaint.setDither(true);// 防抖动
  43.                 iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
  44.                 Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
  45.                 Rect dst = new Rect(0, 0, iconSize, iconSize);
  46.                 canvas.drawBitmap(icon, src, dst, iconPaint);
  47.                 
  48.                 if(isShowNum){
  49.                          
  50.                         if(TextUtils.isEmpty(num)){
  51.                                 num = "0";
  52.                         }
  53.                         
  54.                         if(!TextUtils.isDigitsOnly(num)){
  55.                                 //非数字
  56.                                 Log.e(TAG, "the num is not digit :"+ num);
  57.                                 num = "0";
  58.                         }
  59.                         
  60.                         int numInt = Integer.valueOf(num);
  61.                         
  62.                         if(numInt > 99){//超过99
  63.                                 
  64.                                 num = "99+";
  65.                                 
  66.                                 // 启用抗锯齿和使用设备的文本字体大小
  67.                                 Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
  68.                                 numPaint.setColor(Color.WHITE);
  69.                                 numPaint.setTextSize(20f*factor);
  70.                                 numPaint.setTypeface(Typeface.DEFAULT_BOLD);
  71.                                 int textWidth=(int)numPaint.measureText(num, 0, num.length());
  72.                                 
  73.                                 Log.e(TAG, "text width:"+textWidth);
  74.                                 
  75.                                 int circleCenter = (int) (15*factor);//中心坐标
  76.                                 int circleRadius = (int) (13*factor);//圆的半径
  77.                                 
  78.                                 //绘制左边的圆形
  79.                                 Paint leftCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  80.                                 leftCirPaint.setColor(Color.RED);
  81.                                 canvas.drawCircle(iconSize-circleRadius-textWidth+(10*factor), circleCenter, circleRadius, leftCirPaint);
  82.                                 
  83.                                 //绘制右边的圆形
  84.                                 Paint rightCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  85.                                 rightCirPaint.setColor(Color.RED);
  86.                                 canvas.drawCircle(iconSize-circleRadius, circleCenter, circleRadius, rightCirPaint);
  87.                                 
  88.                                 //绘制中间的距形
  89.                                 Paint rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  90.                                 rectPaint.setColor(Color.RED);
  91.                                 RectF oval = new RectF(iconSize-circleRadius-textWidth+(10*factor), 2*factor, iconSize-circleRadius, circleRadius*2+2*factor);
  92.                                 canvas.drawRect(oval, rectPaint);

  93.                                 //绘制数字
  94.                                 canvas.drawText(num, (float)(iconSize-textWidth/2-(24*factor)), 23*factor,        numPaint);
  95.                                 
  96.                         }else{//<=99
  97.                         
  98.                                 // 启用抗锯齿和使用设备的文本字体大小
  99.                                 Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
  100.                                 numPaint.setColor(Color.WHITE);
  101.                                 numPaint.setTextSize(20f*factor);
  102.                                 numPaint.setTypeface(Typeface.DEFAULT_BOLD);
  103.                                 int textWidth=(int)numPaint.measureText(num, 0, num.length());
  104.                                 
  105.                                 Log.e(TAG, "text width:"+textWidth);
  106.                                 
  107.                                 //绘制外面的圆形
  108.                                 //Paint outCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  109.                                 //outCirPaint.setColor(Color.WHITE);
  110.                                 //canvas.drawCircle(iconSize - 15, 15, 15, outCirPaint);
  111.                                 
  112.                                 //绘制内部的圆形
  113.                                 Paint inCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  114.                                 inCirPaint.setColor(Color.RED);
  115.                                 canvas.drawCircle(iconSize-15*factor, 15*factor, 15*factor, inCirPaint);
  116.                                 
  117.                                 //绘制数字
  118.                                 canvas.drawText(num, (float)(iconSize-textWidth/2-15*factor), 22*factor, numPaint);
  119.                         }
  120.                 }
  121.                 return numIcon;
  122.         }


  123.         /***
  124.          * 
  125.          * 生成有数字的图片(没有边框)
  126.          * @param context
  127.          * @param icon 图片
  128.          * @param isShowNum 是否要绘制数字
  129.          * @param num 数字字符串:整型数字 超过99,显示为"99+"
  130.          * @return
  131.          */
  132.         public static Bitmap generatorNumIcon2(Context context, Bitmap icon, boolean isShowNum, String num) {
  133.                 
  134.                 DisplayMetrics dm = context.getResources().getDisplayMetrics();
  135.                 //基准屏幕密度
  136.                 float baseDensity = 1.5f;//240dpi
  137.                 float factor = dm.density/baseDensity;
  138.                 
  139.                 Log.e(TAG, "density:"+dm.density);
  140.                 Log.e(TAG, "dpi:"+dm.densityDpi);
  141.                 Log.e(TAG, "factor:"+factor);
  142.                 
  143.                 // 初始化画布
  144.                 int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
  145.                 Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
  146.                 Canvas canvas = new Canvas(numIcon);

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

  154.                 if(isShowNum){
  155.                          
  156.                         if(TextUtils.isEmpty(num)){
  157.                                 num = "0";
  158.                         }
  159.                         
  160.                         if(!TextUtils.isDigitsOnly(num)){
  161.                                 //非数字
  162.                                 Log.e(TAG, "the num is not digit :"+ num);
  163.                                 num = "0";
  164.                         }
  165.                         
  166.                         int numInt = Integer.valueOf(num);
  167.                         
  168.                         if(numInt > 99){//超过99
  169.                                 num = "99+";
  170.                         }

  171.                         //启用抗锯齿和使用设备的文本字体大小
  172.                         //测量文本占用的宽度
  173.                         Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
  174.                         numPaint.setColor(Color.WHITE);
  175.                         numPaint.setTextSize(20f*factor);
  176.                         numPaint.setTypeface(Typeface.DEFAULT_BOLD);
  177.                         int textWidth=(int)numPaint.measureText(num, 0, num.length());
  178.                         Log.e(TAG, "text width:"+textWidth);
  179.                         
  180.                         /**----------------------------------*
  181.                          * TODO 绘制圆角矩形背景 start
  182.                          *------------------------------------*/
  183.                         //圆角矩形背景的宽度
  184.                         int backgroundHeight = (int) (2*15*factor);
  185.                         int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
  186.                         
  187.                         canvas.save();//保存状态
  188.                         
  189.                         ShapeDrawable drawable = getDefaultBackground(context);
  190.                         drawable.setIntrinsicHeight(backgroundHeight);
  191.                         drawable.setIntrinsicWidth(backgroundWidth);
  192.                         drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
  193.                         canvas.translate(iconSize-backgroundWidth, 0);
  194.                         drawable.draw(canvas);
  195.                         
  196.                         canvas.restore();//重置为之前保存的状态
  197.                         
  198.                         /**----------------------------------*
  199.                          * TODO 绘制圆角矩形背景 end
  200.                          *------------------------------------*/
  201.                         
  202.                         //绘制数字
  203.                         canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth)/2), 22*factor, numPaint);
  204.                 }
  205.                 return numIcon;
  206.         }
  207.         /***
  208.          * 
  209.          * 生成有数字的图片(有边框)
  210.          * @param context
  211.          * @param icon 图片
  212.          * @param isShowNum 是否要绘制数字
  213.          * @param num 数字字符串:整型数字 超过99,显示为"99+"
  214.          * @return
  215.          */
  216.         public static Bitmap generatorNumIcon3(Context context, Bitmap icon, boolean isShowNum, String num) {
  217.                 
  218.                 DisplayMetrics dm = context.getResources().getDisplayMetrics();
  219.                 //基准屏幕密度
  220.                 float baseDensity = 1.5f;//240dpi
  221.                 float factor = dm.density/baseDensity;
  222.                 
  223.                 Log.e(TAG, "density:"+dm.density);
  224.                 Log.e(TAG, "dpi:"+dm.densityDpi);
  225.                 Log.e(TAG, "factor:"+factor);
  226.                 
  227.                 // 初始化画布
  228.                 int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
  229.                 Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
  230.                 Canvas canvas = new Canvas(numIcon);
  231.                 
  232.                 // 拷贝图片
  233.                 Paint iconPaint = new Paint();
  234.                 iconPaint.setDither(true);// 防抖动
  235.                 iconPaint.setFilterBitmap(true);// 用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果
  236.                 Rect src = new Rect(0, 0, icon.getWidth(), icon.getHeight());
  237.                 Rect dst = new Rect(0, 0, iconSize, iconSize);
  238.                 canvas.drawBitmap(icon, src, dst, iconPaint);
  239.                 
  240.                 if(isShowNum){
  241.                         
  242.                         if(TextUtils.isEmpty(num)){
  243.                                 num = "0";
  244.                         }
  245.                         
  246.                         if(!TextUtils.isDigitsOnly(num)){
  247.                                 //非数字
  248.                                 Log.e(TAG, "the num is not digit :"+ num);
  249.                                 num = "0";
  250.                         }
  251.                         
  252.                         int numInt = Integer.valueOf(num);
  253.                         
  254.                         if(numInt > 99){//超过99
  255.                                 num = "99+";
  256.                         }
  257.                         
  258.                         //启用抗锯齿和使用设备的文本字体大小
  259.                         //测量文本占用的宽度
  260.                         Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
  261.                         numPaint.setColor(Color.WHITE);
  262.                         numPaint.setTextSize(20f*factor);
  263.                         numPaint.setTypeface(Typeface.DEFAULT_BOLD);
  264.                         int textWidth=(int)numPaint.measureText(num, 0, num.length());
  265.                         Log.e(TAG, "text width:"+textWidth);
  266.                         
  267.                         /**----------------------------------*
  268.                          * TODO 绘制圆角矩形背景:先画边框,再画内部的圆角矩形 start
  269.                          *------------------------------------*/
  270.                         //圆角矩形背景的宽度
  271.                         int backgroundHeight = (int) (2*15*factor);
  272.                         int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
  273.                         //边框的宽度
  274.                         int strokeThickness = (int) (2*factor);
  275.                         
  276.                         canvas.save();//保存状态
  277.                         
  278.                         int strokeHeight = backgroundHeight + strokeThickness*2;
  279.                         int strokeWidth = textWidth>strokeHeight ? (int)(textWidth+ 10*factor + 2*strokeThickness) : strokeHeight;
  280.                         ShapeDrawable outStroke = getDefaultStrokeDrawable(context);
  281.                         outStroke.setIntrinsicHeight(strokeHeight);
  282.                         outStroke.setIntrinsicWidth(strokeWidth);
  283.                         outStroke.setBounds(0, 0, strokeWidth, strokeHeight);
  284.                         canvas.translate(iconSize-strokeWidth-strokeThickness, strokeThickness);
  285.                         outStroke.draw(canvas);
  286.                         
  287.                         canvas.restore();//重置为之前保存的状态
  288.                         
  289.                         canvas.save();//保存状态
  290.                         
  291.                         ShapeDrawable drawable = getDefaultBackground(context);
  292.                         drawable.setIntrinsicHeight((int) (backgroundHeight+2*factor));
  293.                         drawable.setIntrinsicWidth((int) (backgroundWidth+2*factor));
  294.                         drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
  295.                         canvas.translate(iconSize-backgroundWidth-2*strokeThickness, 2*strokeThickness);
  296.                         drawable.draw(canvas);
  297.                         
  298.                         canvas.restore();//重置为之前保存的状态
  299.                         
  300.                         /**----------------------------------*
  301.                          * TODO 绘制圆角矩形背景 end
  302.                          *------------------------------------*/
  303.                         
  304.                         //绘制数字
  305.                         canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+4*strokeThickness)/2), (22)*factor+2*strokeThickness, numPaint);
  306.                 }
  307.                 return numIcon;
  308.         }

  309.         /***
  310.          * 
  311.          * 生成有数字的图片(有边框的)
  312.          * @param context
  313.          * @param icon 图片
  314.          * @param isShowNum 是否要绘制数字
  315.          * @param num 数字字符串:整型数字 超过99,显示为"99+"
  316.          * @return
  317.          */
  318.         public static Bitmap generatorNumIcon4(Context context, Bitmap icon, boolean isShowNum, String num) {
  319.                 
  320.                 DisplayMetrics dm = context.getResources().getDisplayMetrics();
  321.                 //基准屏幕密度
  322.                 float baseDensity = 1.5f;//240dpi
  323.                 float factor = dm.density/baseDensity;
  324.                 
  325.                 Log.e(TAG, "density:"+dm.density);
  326.                 Log.e(TAG, "dpi:"+dm.densityDpi);
  327.                 Log.e(TAG, "factor:"+factor);
  328.                 
  329.                 // 初始化画布
  330.                 int iconSize = (int) context.getResources().getDimension(android.R.dimen.app_icon_size);
  331.                 Bitmap numIcon = Bitmap.createBitmap(iconSize, iconSize, Config.ARGB_8888);
  332.                 Canvas canvas = new Canvas(numIcon);

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

  340.                 if(isShowNum){
  341.                          
  342.                         if(TextUtils.isEmpty(num)){
  343.                                 num = "0";
  344.                         }
  345.                         
  346.                         if(!TextUtils.isDigitsOnly(num)){
  347.                                 //非数字
  348.                                 Log.e(TAG, "the num is not digit :"+ num);
  349.                                 num = "0";
  350.                         }
  351.                         
  352.                         int numInt = Integer.valueOf(num);
  353.                         
  354.                         if(numInt > 99){//超过99
  355.                                 num = "99+";
  356.                         }

  357.                         //启用抗锯齿和使用设备的文本字体
  358.                         //测量文本占用的宽度
  359.                         Paint numPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
  360.                         numPaint.setColor(Color.WHITE);
  361.                         numPaint.setTextSize(25f*factor);
  362.                         numPaint.setTypeface(Typeface.DEFAULT_BOLD);
  363.                         int textWidth=(int)numPaint.measureText(num, 0, num.length());
  364.                         Log.e(TAG, "text width:"+textWidth);
  365.                         
  366.                         /**----------------------------------*
  367.                          * TODO 绘制圆角矩形背景 start
  368.                          *------------------------------------*/
  369.                         //边框的宽度
  370.                         int strokeThickness = (int) (DEFAULT_STROKE_WIDTH_DIP*factor);
  371.                         //圆角矩形背景的宽度
  372.                         float radiusPx = 15*factor;
  373.                         int backgroundHeight = (int) (2*(radiusPx+strokeThickness));//2*(半径+边框宽度)
  374.                         int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth + 10*factor + 2*strokeThickness) : backgroundHeight;
  375.                         
  376.                         canvas.save();//保存状态
  377.                         
  378.                         ShapeDrawable drawable = getDefaultBackground2(context);
  379.                         drawable.setIntrinsicHeight(backgroundHeight);
  380.                         drawable.setIntrinsicWidth(backgroundWidth);
  381.                         drawable.setBounds(0, 0, backgroundWidth, backgroundHeight);
  382.                         canvas.translate(iconSize-backgroundWidth-strokeThickness, 2*strokeThickness);
  383.                         drawable.draw(canvas);
  384.                         
  385.                         canvas.restore();//重置为之前保存的状态
  386.                         
  387.                         /**----------------------------------*
  388.                          * TODO 绘制圆角矩形背景 end
  389.                          *------------------------------------*/
  390.                         
  391.                         //绘制数字
  392.                         canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+2*strokeThickness)/2), (float) (25*factor+2.5*strokeThickness), numPaint);
  393.                 }
  394.                 return numIcon;
  395.         }
  396.         
  397.         /***
  398.          * 创建原生系统的快捷方式
  399.          * @param context 
  400.          * @param clazz 启动的activity
  401.          * @param isShowNum 是否显示数字
  402.          * @param num 显示的数字:整型
  403.          * @param isStroke 是否加上边框
  404.          */
  405.         
  406.         public static void installRawShortCut(Context context, Class<?> clazz, boolean isShowNum, String num, boolean isStroke) {
  407.                 Log.e(TAG, "installShortCut....");
  408.                 
  409.                 Intent shortcutIntent = new Intent(        "com.android.launcher.action.INSTALL_SHORTCUT");
  410.                 //名称
  411.                 shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,        context.getString(R.string.app_name));
  412.                 
  413.                 // 是否可以有多个快捷方式的副本,参数如果是true就可以生成多个快捷方式,如果是false就不会重复添加
  414.                 shortcutIntent.putExtra("duplicate", false);
  415.                 
  416.                 //点击快捷方式:打开activity
  417.                 Intent mainIntent = new Intent(Intent.ACTION_MAIN);
  418.                 mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  419.                 mainIntent.setClass(context, clazz);
  420.                 shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mainIntent);
  421.                 
  422.                 //快捷方式的图标
  423.                 if(isStroke){
  424.                         shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
  425.                                         generatorNumIcon4(
  426.                                                         context, 
  427.                                                         ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
  428.                                                         isShowNum, 
  429.                                                         num));
  430.                 }else{
  431.                         shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
  432.                                         generatorNumIcon2(
  433.                                                         context, 
  434.                                                         ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(),
  435.                                                         isShowNum, 
  436.                                                         num));
  437.                 }
  438.                 context.sendBroadcast(shortcutIntent);
  439.         }

  440.                                                                                                                                                                                                         
  441.         /***
  442.          * 是否已经创建了快捷方式
  443.          * @param context
  444.          * @return
  445.          */
  446.         public static boolean isAddShortCut(Context context) {
  447.                   Log.e(TAG, "isAddShortCut....");
  448.           
  449.             boolean isInstallShortcut = false;
  450.             final ContentResolver cr = context.getContentResolver();
  451.             
  452.             //TODO 注释的代码,在有的手机:修改了ROM的系统,不能支持
  453.             /*int versionLevel = android.os.Build.VERSION.SDK_INT;
  454.                         String AUTHORITY = "com.android.launcher2.settings";
  455.                         //2.2以上的系统的文件文件名字是不一样的
  456.                         if (versionLevel >= 8) {
  457.                             AUTHORITY = "com.android.launcher2.settings";
  458.                         } else {
  459.                             AUTHORITY = "com.android.launcher.settings";
  460.                         }*/
  461.         
  462.                 String AUTHORITY = getAuthorityFromPermission(context, "com.android.launcher.permission.READ_SETTINGS");
  463.                 Log.e(TAG, "AUTHORITY  :  " +AUTHORITY);
  464.                 final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
  465.                 + "/favorites?notify=true");
  466.         
  467.                 Cursor c = cr.query(CONTENT_URI,
  468.                         new String[] { "title" }, "title=?",
  469.                         new String[] { context.getString(R.string.app_name) }, null);
  470.                 
  471.                 if (c != null && c.getCount() > 0) {
  472.                     isInstallShortcut = true;
  473.                 }
  474.                 
  475.                 if(c != null){
  476.                         c.close();
  477.                 }
  478.                 
  479.                 Log.e(TAG, "isAddShortCut....isInstallShortcut="+isInstallShortcut);
  480.             
  481.             return isInstallShortcut;
  482.         }
  483.           
  484.         /**
  485.          * 删除快捷方式 
  486.          * @param context
  487.          * @param clazz
  488.          */
  489.          public static void deleteShortCut(Context context, Class<?> clazz){
  490.                  Log.e(TAG, "delShortcut....");
  491.                   
  492.                  if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
  493.                         //小米
  494.                         //当为""时,不显示数字,相当于隐藏了)
  495.                         xiaoMiShortCut(context, clazz, "");
  496.                   
  497.                 }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
  498.                         //三星
  499.                         samsungShortCut(context, "0");
  500.                         
  501.                 }else {//其他原生系统手机
  502.                         //删除显示数字的快捷方式
  503.                         deleteRawShortCut(context, clazz);
  504.                         //安装不显示数字的快捷方式
  505.                         //installRawShortCut(context, clazz, false, "0");
  506.                 }
  507.          }

  508.         /***
  509.          * 删除原生系统的快捷方式
  510.          * @param context
  511.          * @param clazz 启动的activity
  512.          */
  513.         public static void deleteRawShortCut(Context context, Class<?> clazz) {
  514.                 Intent intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
  515.                 //快捷方式的名称
  516.                 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, context.getString(R.string.app_name));
  517.                 
  518.                 Intent intent2 = new Intent(); 
  519.                 intent2.setClass(context, clazz); 
  520.                 intent2.setAction(Intent.ACTION_MAIN); 
  521.                 intent2.addCategory(Intent.CATEGORY_LAUNCHER); 
  522.                 intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,intent2); 
  523.                 
  524.                 context.sendBroadcast(intent);
  525.         }
  526.           
  527.           
  528.           /***
  529.          * 取得权限相应的认证URI
  530.          * @param context
  531.          * @param permission
  532.          * @return
  533.          */
  534.         public static String getAuthorityFromPermission(Context context, String permission) {
  535.                 if (TextUtils.isEmpty(permission)) {
  536.                         return null;
  537.                 }
  538.                 List<PackageInfo> packInfos = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
  539.                 if (packInfos == null) {
  540.                         return null;
  541.                 }
  542.                 for (PackageInfo info : packInfos) {
  543.                         ProviderInfo[] providers = info.providers;
  544.                         if (providers != null) {
  545.                                 for (ProviderInfo provider : providers) {
  546.                                         if (permission.equals(provider.readPermission)
  547.                                                         || permission.equals(provider.writePermission)) {
  548.                                                 return provider.authority;
  549.                                         }
  550.                                 }
  551.                         }
  552.                 }
  553.                 return null;
  554.         }

  555.         /***
  556.          * 在小米应用图标的快捷方式上加数字<br>
  557.          * 
  558.          * 
  559.          * @param context
  560.          * @param num 显示的数字:大于99,为"99",当为""时,不显示数字,相当于隐藏了)<br><br>
  561.          * 
  562.          * 注意点:
  563.          * context.getPackageName()+"/."+clazz.getSimpleName() (这个是启动activity的路径)中的"/."不能缺少
  564.          * 
  565.          */
  566.         public static void xiaoMiShortCut(Context context,Class<?> clazz, String num)
  567.           {
  568.                 Log.e(TAG, "xiaoMiShortCut....");
  569.                 Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
  570.                 localIntent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName()+"/."+clazz.getSimpleName());
  571.                 if(TextUtils.isEmpty(num)){
  572.                         num = "";
  573.                 }else{
  574.                     int numInt = Integer.valueOf(num);
  575.                     if (numInt > 0){
  576.                           if (numInt > 99){
  577.                                 num = "99";
  578.                       }
  579.                     }else{
  580.                             num = "0";
  581.                     }
  582.                 }
  583.                 localIntent.putExtra("android.intent.extra.update_application_message_text", num);
  584.                 context.sendBroadcast(localIntent);
  585.           }                                                                                        
  586.                  
  587.          /***
  588.           * 索尼手机:应用图标的快捷方式上加数字
  589.           * @param context
  590.           * @param num
  591.           */
  592.         public static void sonyShortCut(Context context, String num)
  593.           {
  594.             String activityName = getLaunchActivityName(context);
  595.             if (activityName == null){
  596.               return;
  597.             }
  598.             Intent localIntent = new Intent();
  599.             int numInt = Integer.valueOf(num);
  600.             boolean isShow = true;
  601.             if (numInt < 1){
  602.               num = "";
  603.               isShow = false;
  604.             }else if (numInt > 99){
  605.                     num = "99";
  606.             }
  607.             localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);
  608.             localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
  609.             localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", activityName);
  610.             localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", num);
  611.             localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
  612.             context.sendBroadcast(localIntent);
  613.           }
  614.                  
  615.          /***
  616.           * 三星手机:应用图标的快捷方式上加数字
  617.           * @param context
  618.           * @param num
  619.           */
  620.         public static void samsungShortCut(Context context, String num)
  621.          {
  622.                 int numInt = Integer.valueOf(num);
  623.             if (numInt < 1)
  624.             {
  625.               num = "0";
  626.             }else if (numInt > 99){
  627.                     num = "99";
  628.             }
  629.                  String activityName = getLaunchActivityName(context);
  630.             Intent localIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
  631.             localIntent.putExtra("badge_count", num);
  632.             localIntent.putExtra("badge_count_package_name", context.getPackageName());
  633.             localIntent.putExtra("badge_count_class_name", activityName);
  634.             context.sendBroadcast(localIntent);
  635.          }
  636.                  
  637.          /***
  638.           * 在应用图标的快捷方式上加数字
  639.           * @param clazz 启动的activity
  640.           * @param isShowNum 是否显示数字
  641.           * @param num 显示的数字:整型
  642.           * @param isStroke 是否加上边框
  643.           * 
  644.           */
  645.         public static void addNumShortCut(Context context,Class<?> clazz,boolean isShowNum, String num, boolean isStroke)
  646.           {
  647.                  Log.e(TAG, "manufacturer="+Build.MANUFACTURER);
  648.             if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")){
  649.                     //小米
  650.               xiaoMiShortCut(context, clazz, num);
  651.               
  652.             }else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
  653.                     //三星
  654.                     samsungShortCut(context, num);
  655.                     
  656.             }else {//其他原生系统手机
  657.                     installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
  658.             }
  659.             
  660.           }
  661.                  
  662.          /***
  663.           * 取得当前应用的启动activity的名称:
  664.           * mainfest.xml中配置的 android:name:"
  665.           * @param context
  666.           * @return
  667.           */
  668.         public static String getLaunchActivityName(Context context)
  669.          {
  670.             PackageManager localPackageManager = context.getPackageManager();
  671.             Intent localIntent = new Intent("android.intent.action.MAIN");
  672.             localIntent.addCategory("android.intent.category.LAUNCHER");
  673.             try
  674.             {
  675.               Iterator<ResolveInfo> localIterator = localPackageManager.queryIntentActivities(localIntent, 0).iterator();
  676.               while (localIterator.hasNext())
  677.               {
  678.                 ResolveInfo localResolveInfo = localIterator.next();
  679.                 if (!localResolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(context.getPackageName()))
  680.                   continue;
  681.                 String str = localResolveInfo.activityInfo.name;
  682.                 return str;
  683.               }
  684.             }
  685.             catch (Exception localException)
  686.             {
  687.               return null;
  688.             }
  689.             return null;
  690.          }
  691.                          
  692.         /***
  693.          * 得到一个默认的背景:圆角矩形<br><br>
  694.          * 使用代码来生成一个背景:相当于用<shape>的xml的背景
  695.          * 
  696.          * @return
  697.          */
  698.         private static ShapeDrawable getDefaultBackground(Context context) {
  699.                 
  700.                 //这个是为了应对不同分辨率的手机,屏幕兼容性
  701.                 int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
  702.                 float[] outerR = new float[] {r, r, r, r, r, r, r, r};
  703.             
  704.                 //圆角矩形
  705.                 RoundRectShape rr = new RoundRectShape(outerR, null, null);
  706.                 ShapeDrawable drawable = new ShapeDrawable(rr);
  707.                 drawable.getPaint().setColor(DEFAULT_NUM_COLOR);//设置颜色
  708.                 return drawable;
  709.                 
  710.         }
  711.         /***
  712.          * 得到一个默认的背景:圆角矩形<br><br>
  713.          * 使用代码来生成一个背景:相当于用<shape>的xml的背景
  714.          * 
  715.          * @return
  716.          */
  717.         private static ShapeDrawable getDefaultBackground2(Context context) {
  718.                 
  719.                 //这个是为了应对不同分辨率的手机,屏幕兼容性
  720.                 int r = dipToPixels(context,DEFAULT_CORNER_RADIUS_DIP);
  721.                 float[] outerR = new float[] {r, r, r, r, r, r, r, r};
  722.                 int distance = dipToPixels(context,DEFAULT_STROKE_WIDTH_DIP);
  723.                 
  724.                 //圆角矩形
  725.                 RoundRectShape rr = new RoundRectShape(outerR, null, null);
  726.                 customBorderDrawable drawable = new customBorderDrawable(context,rr);
  727.                 drawable.getFillpaint().setColor(DEFAULT_NUM_COLOR);//设置填充颜色
  728.                 drawable.getStrokepaint().setColor(DEFAULT_STROKE_COLOR);//设置边框颜色
  729.                 drawable.getStrokepaint().setStrokeWidth(distance);//设置边框宽度
  730.                 return drawable;
  731.                 
  732.         }
  733.                 
  734.                 
  735.         /***
  736.          * 得到一个默认的背景:圆角矩形<br><br>
  737.          * 使用代码来生成一个背景:相当于用<shape>的xml的背景
  738.          * 
  739.          * @return
  740.          */
  741.         private static ShapeDrawable getDefaultStrokeDrawable(Context context) {
  742.                 
  743.                 //这个是为了应对不同分辨率的手机,屏幕兼容性
  744.                 int r = dipToPixels(context, DEFAULT_CORNER_RADIUS_DIP);
  745.                 int distance = dipToPixels(context, DEFAULT_STROKE_WIDTH_DIP);
  746.                 float[] outerR = new float[] {r, r, r, r, r, r, r, r};
  747.             
  748.                 //圆角矩形
  749.                 RoundRectShape rr = new RoundRectShape(outerR, null, null);
  750.                 ShapeDrawable drawable = new ShapeDrawable(rr);
  751.                 drawable.getPaint().setStrokeWidth(distance);
  752.                 drawable.getPaint().setStyle(Paint.Style.FILL);
  753.                 drawable.getPaint().setColor(DEFAULT_STROKE_COLOR);//设置颜色
  754.                 return drawable;
  755.         }
  756.                 
  757.         /***
  758.          * dp to px
  759.          * @param dip
  760.          * @return
  761.          */
  762.         public static int dipToPixels(Context context, int dip) {
  763.                 Resources r = context.getResources();
  764.                 float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, r.getDisplayMetrics());
  765.                 return (int) px;
  766.         }
  767. }
复制代码



另外项目代码中的 customBorderDrawable类,有点粗心,没有改成首字母大写,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值