常见场景:
通过BitmapFactory.decodeResource的方式,设置Notification的LargeIcon,当APP适配了自适应Icon后,获取不到Bitmap对象。
方式一:
public Bitmap getAppIcon(Context context) {
if (context == null) {
return null;
}
try {
PackageManager packageManager = context.getApplicationContext().getPackageManager();
String packageName = context.getApplicationContext().getPackageName();
Drawable drawable = packageManager.getApplicationIcon(packageName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof AdaptiveIconDrawable) {
Drawable[] drr = new Drawable[2];
drr[0] = ((AdaptiveIconDrawable) drawable).getBackground();
drr[1] = ((AdaptiveIconDrawable) drawable).getForeground();
LayerDrawable layerDrawable = new LayerDrawable(drr);
int width = layerDrawable.getIntrinsicWidth();
int height = layerDrawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
layerDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
layerDrawable.draw(canvas);
return bitmap;
}
} else {
return ((BitmapDrawable) drawable).getBitmap();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
方式二:
public Bitmap getAppIcon(Context context) {
if (context == null) {
return null;
}
try {
PackageManager packageManager = context.getApplicationContext().getPackageManager();
String packageName = context.getApplicationContext().getPackageName();
Drawable drawable = packageManager.getApplicationIcon(packageName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof AdaptiveIconDrawable) {
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
} else {
return ((BitmapDrawable) drawable).getBitmap();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
本文提供两种解决自适应图标下无法获取Bitmap对象的方法,用于设置Notification的LargeIcon,适用于Android O及更高版本。第一种方法通过LayerDrawable绘制自适应图标,第二种方法直接利用Drawable创建Bitmap。
294

被折叠的 条评论
为什么被折叠?



