- 浏览: 2141938 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
在小米 三星 索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。
小米已经测试通过了,
三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),
测试一下,可以在回复一下测试结果,谢谢
(注:在这里重点说一下Notifyer+此app却可以在android2.2+和以上系统都实现角标,从网上查了下,然后又看了下辅助功能的实现,可以确定实现方式是通过辅助功能来实现的)
1.原生系统(原生的Launcher ),只能修改快捷方式,增加和删除都会有toast提示
2.小米 三星 索尼 手机: 自定义的launcher: 发送显示未读消息数的action已经不同了。具体可以去看代码。。。
判断手机的代码:
下面写好的工具类,上面的方法也在其中。
另外项目代码中的 customBorderDrawable类,有点粗心,没有改成首字母大写,
另外,这几天,看到大神dkmeteor分享的几个例子,好好。
http://www.eoeandroid.com/thread-541767-1-1.html
http://www.eoeandroid.com/thread-541780-1-1.html
小米已经测试通过了,
三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码),
测试一下,可以在回复一下测试结果,谢谢
(注:在这里重点说一下Notifyer+此app却可以在android2.2+和以上系统都实现角标,从网上查了下,然后又看了下辅助功能的实现,可以确定实现方式是通过辅助功能来实现的)
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; } }
另外项目代码中的 customBorderDrawable类,有点粗心,没有改成首字母大写,
另外,这几天,看到大神dkmeteor分享的几个例子,好好。
http://www.eoeandroid.com/thread-541767-1-1.html
http://www.eoeandroid.com/thread-541780-1-1.html
- TestShortCut.rar (3.2 MB)
- 下载次数: 47
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 562本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1019颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 921从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1025Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 892Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 760前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 848监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 724在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 820最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1218##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 989当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 671setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1396问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 673底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1653点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1287import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2192TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1437一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 786Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 882最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
在app图标上添加更新消息数字提示,只支持三星,小米,索尼手机
在Android原生系统中,众所周知不支持桌面图标显示未读消息提醒的数字,虽然第三方控件BadgeView可以实现应用内的数字提醒。但对于系统的图标,特别是app的logo图标很难实现数字标志,即使是绘图的方式不断修改,但...
android app图标未读消息数(BadgeNumber). 仅仅支持三星/小米/索尼
Android应用图标右上角显示数字/图标数字角标,支持小米手机系统、三星手机系统、索尼手机系统(未验证)、Android原生系统(4.3的系统通过验证,其他未验证)
在小米 三星 索尼 手机 :图标上显示数字(未读消息数):这部分代码,是从QQ5.0.apk中找的。 小米已经测试通过了, 三星和索尼的,由于没有相应的手机,没有测试,有的,可能修改一下代码(判断是什么手机的代码)...
代码为android6.0可运行,支持各种机型桌面未读消息数字提醒,包括:华为,ViVo,OPPO,小米,ZTE,Zuk,Samsug,Sony,Noval,Adw,Apex,Asus,LG等
小米6手机小米6S全系列:原厂维修图纸小米6X 原理图 电路图: 小米6 位置图 点位图 位号图.PDF 小米6 原理图 电路图.pdf 小米6 注释图 主板元件分布图.pdf 小米6 逻辑框图 主板元件分布图.pdf 小米6 一 二级维修指导....
小米5c手机usb驱动是小米为旗下最新产品小米5c提供的电脑驱动程序,小米在手机命名这一块跟苹果真是学的到家,在小米6还没上线之际发布了这款全新的5c手机。如果你入手了这款手机想要连接到电脑可以来西西下载这款...
小米科技专题报告:小米(MI):从Mobile到IoT,科技独角兽的非凡之路.pdf
小米论坛同款帖子图标
小米全产品图标,可爱图标,详情信息看压缩包内资源显示
备份与还原:该功能与手机端的备份功能类似,不过可以将备份数据放置在PC上,节省更多手机空间。 共享上网:没有WIFI也不怕,用手机连接PC后,开启共享上网,手机就可以通过PC的网络访问了,无论是下载音乐,还是...
雷军给小米年报划重点:调整、技术研发、“手机+AIoT”双引擎战略.pdf
小米手机小米平板红米手机全系列原厂维修图纸原理图PCB图合集: 小米3原厂维修图纸 小米4C原厂维修图纸 小米4S原厂维修图纸 小米4原厂维修图纸 小米5C原厂维修图纸 小米5SPlus原厂维修图纸 小米5S原厂维修图纸 小米5...
电子元器件:小米集团-W:Q3手机业务稳健经营IOT业务增长势头强劲
小米8手机驱动是专为小米8手机用户们打造的驱动程序,安装了这款驱动你就可以方便用电脑来管理你的小米...小米8手机介绍小米8是小米公司2018年5月31日发布的8周年旗舰手机,亦是小米数字系列的第七代手机,欢迎下载体验
电子元器件:小米集团-W:Q3手机业务稳健经营IOT业务增长势头强劲.pdf
小米5手机小米5S全系列原厂维修图纸小米5X 原理图 电路图合集 小米5 位置图 点位图 位号图.pdf 小米5 原理图 电路图.pdf 小米5 注释图 主板元件分布图.pdf 小米5 逻辑框图 主板元件分布图.pdf 小米5 一二级维修指南....