Android 實現(xiàn)桌面未讀角標(biāo)
在小米 三星 索尼 手機 :圖標(biāo)上顯示數(shù)字(未讀消息數(shù)):這部分代碼,是從QQ5.0.apk中找的。
小米已經(jīng)測試通過了,
三星和索尼的,由于沒有相應(yīng)的手機,沒有測試,有的,可能修改一下代碼(判斷是什么手機的代碼),
測試一下,可以在回復(fù)一下測試結(jié)果,謝謝
1.原生系統(tǒng)(原生的Launcher ),只能修改快捷方式,增加和刪除都會有toast提示
2.小米 三星 索尼 手機: 自定義的launcher: 發(fā)送顯示未讀消息數(shù)的action已經(jīng)不同了。具體可以去看代碼。。。
判斷手機的代碼:
/***
* 在應(yīng)用圖標(biāo)的快捷方式上加數(shù)字
* @param clazz 啟動的activity
* @param isShowNum 是否顯示數(shù)字
* @param num 顯示的數(shù)字:整型
* @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 {//其他原生系統(tǒng)手機
installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
}
}
下面寫好的工具類,上面的方法也在其中。
/***
* 應(yīng)用的快捷方式工具類
*
* @author yang
*
*/
public class AppShortCutUtil {
private static final String TAG = "AppShortCutUtil";
//默認(rèn)圓角半徑
private static final int DEFAULT_CORNER_RADIUS_DIP = 8;
//默認(rèn)邊框?qū)挾?
private static final int DEFAULT_STROKE_WIDTH_DIP = 2;
//邊框的顏色
private static final int DEFAULT_STROKE_COLOR = Color.WHITE;
//中間數(shù)字的顏色
private static final int DEFAULT_NUM_COLOR = Color.parseColor("#CCFF0000");
/***
*
* 生成有數(shù)字的圖片(沒有邊框)
* @param context
* @param icon 圖片
* @param isShowNum 是否要繪制數(shù)字
* @param num 數(shù)字字符串:整型數(shù)字 超過99,顯示為"99+"
* @return
*/
public static Bitmap generatorNumIcon(Context context, Bitmap icon, boolean isShowNum, String num) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
//基準(zhǔn)屏幕密度
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進行濾波處理,這樣,當(dāng)你選擇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)){
//非數(shù)字
Log.e(TAG, "the num is not digit :"+ num);
num = "0";
}
int numInt = Integer.valueOf(num);
if(numInt > 99){//超過99
num = "99+";
// 啟用抗鋸齒和使用設(shè)備的文本字體大小
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);//中心坐標(biāo)
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);
//繪制數(shù)字
canvas.drawText(num, (float)(iconSize-textWidth/2-(24*factor)), 23*factor, numPaint);
}else{//<=99
// 啟用抗鋸齒和使用設(shè)備的文本字體大小
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);
//繪制內(nèi)部的圓形
Paint inCirPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
inCirPaint.setColor(Color.RED);
canvas.drawCircle(iconSize-15*factor, 15*factor, 15*factor, inCirPaint);
//繪制數(shù)字
canvas.drawText(num, (float)(iconSize-textWidth/2-15*factor), 22*factor, numPaint);
}
}
return numIcon;
}
/***
*
* 生成有數(shù)字的圖片(沒有邊框)
* @param context
* @param icon 圖片
* @param isShowNum 是否要繪制數(shù)字
* @param num 數(shù)字字符串:整型數(shù)字 超過99,顯示為"99+"
* @return
*/
public static Bitmap generatorNumIcon2(Context context, Bitmap icon, boolean isShowNum, String num) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
//基準(zhǔn)屏幕密度
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進行濾波處理,這樣,當(dāng)你選擇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)){
//非數(shù)字
Log.e(TAG, "the num is not digit :"+ num);
num = "0";
}
int numInt = Integer.valueOf(num);
if(numInt > 99){//超過99
num = "99+";
}
//啟用抗鋸齒和使用設(shè)備的文本字體大小
//測量文本占用的寬度
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();//保存狀態(tài)
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();//重置為之前保存的狀態(tài)
/**----------------------------------*
* TODO 繪制圓角矩形背景 end
*------------------------------------*/
//繪制數(shù)字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth)/2), 22*factor, numPaint);
}
return numIcon;
}
/***
*
* 生成有數(shù)字的圖片(有邊框)
* @param context
* @param icon 圖片
* @param isShowNum 是否要繪制數(shù)字
* @param num 數(shù)字字符串:整型數(shù)字 超過99,顯示為"99+"
* @return
*/
public static Bitmap generatorNumIcon3(Context context, Bitmap icon, boolean isShowNum, String num) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
//基準(zhǔn)屏幕密度
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進行濾波處理,這樣,當(dāng)你選擇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)){
//非數(shù)字
Log.e(TAG, "the num is not digit :"+ num);
num = "0";
}
int numInt = Integer.valueOf(num);
if(numInt > 99){//超過99
num = "99+";
}
//啟用抗鋸齒和使用設(shè)備的文本字體大小
//測量文本占用的寬度
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 繪制圓角矩形背景:先畫邊框,再畫內(nèi)部的圓角矩形 start
*------------------------------------*/
//圓角矩形背景的寬度
int backgroundHeight = (int) (2*15*factor);
int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth+10*factor) : backgroundHeight;
//邊框的寬度
int strokeThickness = (int) (2*factor);
canvas.save();//保存狀態(tài)
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();//重置為之前保存的狀態(tài)
canvas.save();//保存狀態(tài)
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();//重置為之前保存的狀態(tài)
/**----------------------------------*
* TODO 繪制圓角矩形背景 end
*------------------------------------*/
//繪制數(shù)字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+4*strokeThickness)/2), (22)*factor+2*strokeThickness, numPaint);
}
return numIcon;
}
/***
*
* 生成有數(shù)字的圖片(有邊框的)
* @param context
* @param icon 圖片
* @param isShowNum 是否要繪制數(shù)字
* @param num 數(shù)字字符串:整型數(shù)字 超過99,顯示為"99+"
* @return
*/
public static Bitmap generatorNumIcon4(Context context, Bitmap icon, boolean isShowNum, String num) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
//基準(zhǔn)屏幕密度
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進行濾波處理,這樣,當(dāng)你選擇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)){
//非數(shù)字
Log.e(TAG, "the num is not digit :"+ num);
num = "0";
}
int numInt = Integer.valueOf(num);
if(numInt > 99){//超過99
num = "99+";
}
//啟用抗鋸齒和使用設(shè)備的文本字體
//測量文本占用的寬度
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*(半徑+邊框?qū)挾?
int backgroundWidth = textWidth>backgroundHeight ? (int)(textWidth + 10*factor + 2*strokeThickness) : backgroundHeight;
canvas.save();//保存狀態(tài)
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();//重置為之前保存的狀態(tài)
/**----------------------------------*
* TODO 繪制圓角矩形背景 end
*------------------------------------*/
//繪制數(shù)字
canvas.drawText(num, (float)(iconSize-(backgroundWidth + textWidth+2*strokeThickness)/2), (float) (25*factor+2.5*strokeThickness), numPaint);
}
return numIcon;
}
/***
* 創(chuàng)建原生系統(tǒng)的快捷方式
* @param context
* @param clazz 啟動的activity
* @param isShowNum 是否顯示數(shù)字
* @param num 顯示的數(shù)字:整型
* @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));
// 是否可以有多個快捷方式的副本,參數(shù)如果是true就可以生成多個快捷方式,如果是false就不會重復(fù)添加
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);
//快捷方式的圖標(biāo)
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);
}
/***
* 是否已經(jīng)創(chuàng)建了快捷方式
* @param context
* @return
*/
public static boolean isAddShortCut(Context context) {
Log.e(TAG, "isAddShortCut....");
boolean isInstallShortcut = false;
final ContentResolver cr = context.getContentResolver();
//TODO 注釋的代碼,在有的手機:修改了ROM的系統(tǒng),不能支持
/*int versionLevel = android.os.Build.VERSION.SDK_INT;
String AUTHORITY = "com.android.launcher2.settings";
//2.2以上的系統(tǒng)的文件文件名字是不一樣的
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")){
//小米
//當(dāng)為""時,不顯示數(shù)字,相當(dāng)于隱藏了)
xiaoMiShortCut(context, clazz, "");
}else if(Build.MANUFACTURER.equalsIgnoreCase("samsung")){
//三星
samsungShortCut(context, "0");
}else {//其他原生系統(tǒng)手機
//刪除顯示數(shù)字的快捷方式
deleteRawShortCut(context, clazz);
//安裝不顯示數(shù)字的快捷方式
//installRawShortCut(context, clazz, false, "0");
}
}
/***
* 刪除原生系統(tǒng)的快捷方式
* @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);
}
/***
* 取得權(quán)限相應(yīng)的認(rèn)證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;
}
/***
* 在小米應(yīng)用圖標(biāo)的快捷方式上加數(shù)字<br>
*
*
* @param context
* @param num 顯示的數(shù)字:大于99,為"99",當(dāng)為""時,不顯示數(shù)字,相當(dāng)于隱藏了)<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);
}
/***
* 索尼手機:應(yīng)用圖標(biāo)的快捷方式上加數(shù)字
* @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);
}
/***
* 三星手機:應(yīng)用圖標(biāo)的快捷方式上加數(shù)字
* @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);
}
/***
* 在應(yīng)用圖標(biāo)的快捷方式上加數(shù)字
* @param clazz 啟動的activity
* @param isShowNum 是否顯示數(shù)字
* @param num 顯示的數(shù)字:整型
* @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 {//其他原生系統(tǒng)手機
installRawShortCut(context, MainActivity.class, isShowNum, num, isStroke);
}
}
/***
* 取得當(dāng)前應(yīng)用的啟動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;
}
/***
* 得到一個默認(rèn)的背景:圓角矩形<br><br>
* 使用代碼來生成一個背景:相當(dāng)于用<shape>的xml的背景
*
* @return
*/
private static ShapeDrawable getDefaultBackground(Context context) {
//這個是為了應(yīng)對不同分辨率的手機,屏幕兼容性
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);//設(shè)置顏色
return drawable;
}
/***
* 得到一個默認(rèn)的背景:圓角矩形<br><br>
* 使用代碼來生成一個背景:相當(dāng)于用<shape>的xml的背景
*
* @return
*/
private static ShapeDrawable getDefaultBackground2(Context context) {
//這個是為了應(yīng)對不同分辨率的手機,屏幕兼容性
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);//設(shè)置填充顏色
drawable.getStrokepaint().setColor(DEFAULT_STROKE_COLOR);//設(shè)置邊框顏色
drawable.getStrokepaint().setStrokeWidth(distance);//設(shè)置邊框?qū)挾?
return drawable;
}
/***
* 得到一個默認(rèn)的背景:圓角矩形<br><br>
* 使用代碼來生成一個背景:相當(dāng)于用<shape>的xml的背景
*
* @return
*/
private static ShapeDrawable getDefaultStrokeDrawable(Context context) {
//這個是為了應(yīng)對不同分辨率的手機,屏幕兼容性
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);//設(shè)置顏色
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;
}
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
kotlin Standard中的內(nèi)聯(lián)函數(shù)示例詳解
這篇文章主要給大家介紹了關(guān)于kotlin Standard中內(nèi)聯(lián)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
詳解Android App中使用VideoView來實現(xiàn)視頻播放的方法
這篇文章主要介紹了Android App中使用VideoView來實現(xiàn)視頻播放的方法,舉例講解了VideoView組件中setVidePath(String path)和setVideoURI(Uri uri)的用法,需要的朋友可以參考下2016-04-04
Android五種隱藏狀態(tài)欄和標(biāo)題欄的方法
這篇文章主要介紹了Android五種隱藏狀態(tài)欄和標(biāo)題欄的方法的相關(guān)資料,需要的朋友可以參考下2017-05-05
Flutter?SystemChrome控制應(yīng)用程序的系統(tǒng)級別行為
這篇文章主要為大家介紹了Flutter?SystemChrome用來控制應(yīng)用程序的系統(tǒng)級別行為步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
UiOS開發(fā)中ITextView回收或關(guān)閉鍵盤使用方法總結(jié)
iOS開發(fā)中,發(fā)現(xiàn)UITextView沒有像UITextField中textFieldShouldReturn:這樣的方法,那么要實現(xiàn)UITextView關(guān)閉鍵盤,必須使用其他的方法,下面是可以使用的幾種方法,需要的朋友參考下吧2016-11-11
android studio 使用Mocklocation虛擬定位
這篇文章主要介紹了android studio 使用Mocklocation虛擬定位總結(jié),本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12

