我们可以通过以下方式实现:
AppIconHelper.java
(应用图标助手.java)
public class AppIconHelper {
public static Bitmap getAppIcon(PackageManager mPackageManager, String packageName) {
if (Build.VERSION.SDK_INT >= 26) {
return AppIconHelperV26.getAppIcon(mPackageManager, packageName);
}
try {
Drawable drawable = mPackageManager.getApplicationIcon(packageName);
return ((BitmapDrawable) drawable).getBitmap();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
对于支持 Android O(>= 26)的设备,我们可以调用 AppIconHelperV26 类来获取 AppIcon。在此过程中,如果其 drawable 是 AdaptiveIconDrawable,则执行以下步骤:
- 获取前景和背景 drawable,并将它们创建为 Layer Drawable
- 使用 Canvas 将 Layer drawable 转换为 Bitmap
AppIconHelperV26.java
public class AppIconHelperV26 {
@RequiresApi(api = Build.VERSION_CODES.O)
public static Bitmap getAppIcon(PackageManager mPackageManager, String packageName) {
try {
Drawable drawable = mPackageManager.getApplicationIcon(packageName);
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof AdaptiveIconDrawable) {
Drawable backgroundDr = ((AdaptiveIconDrawable) drawable).getBackground();
Drawable foregroundDr = ((AdaptiveIconDrawable) drawable).getForeground();
Drawable[] drr = new Drawable[2];
drr[0] = backgroundDr;
drr[1] = foregroundDr;
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;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
现在您可以调用AppIconHelper.getAppIcon获取位图,
AppListAdapter.java
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Bitmap appIcon = AppIconHelper.getAppIcon(packageManager, packageName);
imageView.setImageBitmap(appIcon);
}
Math.max(drawable.getIntrinsicWidth(), 1)
或类似的东西,因为有些可绘制对象如果没有定义大小(如颜色),则可能返回-1。 - Shchvova