【问题标题】:Programatically get Android package icon as PNG or BMP以编程方式将 Android 包图标获取为 PNG 或 BMP
【发布时间】:2018-03-22 20:41:17
【问题描述】:

我试图通过遍历每个包并执行以下操作,将设备上包的所有图标保存为 BMP 或 PNG 文件。

Drawable icon = getPackageManager().getApplicationIcon(packageInfo);
Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), Config.ARGB_8888);

try {
     out = new FileOutputStream("/storage/sdcard0/images/" + packageInfo.packageName +".png");
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
     e.printStackTrace();
} finally {
    try{
     out.close();
    } catch(Throwable ignore) {}
}

虽然这是创建空白图像,但我将如何更改代码以创建图像格式的实际图标?

【问题讨论】:

  • “但我只希望图标作为图像在设备屏幕上的显示方式”——这是什么意思?
  • 也许我对 Android 术语中的“图标”的含义感到困惑,但我希望并假设它是代表应用程序的图像,即单击以启动应用程序的图像。
  • 那又是为了什么?在您的某些应用程序中重复使用它们?除了out = new FileOutputStream("/storage/sdcard0/images/" + packageInfo.packageName +".bmp"); 包含一个绝对路径,据说并不是在每个设备上都可以找到。然后扩展名是 bmp (在 Android 上可笑)。然后你做bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);,所以保存为带有BMP扩展名的PNG格式并尝试以未压缩格式压缩(PNG和BMP未压缩)......我认为这是一团糟。
  • Android 中没有启动应用程序的图标,只是因为您没有在 Android 中启动应用程序。您在应用程序中启动 activity。一个应用程序可能有零个、一个或多个旨在以这种方式启动的活动。
  • @FrankN.Stein 我现在这样做只是为了测试目的,这不是它的实际实现方式。我只是想看看能不能得到每个android包的Drawable图标的图片文件。

标签: android bitmap icons packages


【解决方案1】:

我的问题是如果有人有同样的问题,我引用了这个answer.

我忘了检查图标是否已经是 BitmapDrawable 的实例。因为我可以将其转换为 bitmapdrawable 并使用 .getBitmap

if (icon instanceof BitmapDrawable) {
    bitmap = ((BitmapDrawable)icon).getBitmap();
}else{
    bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), Config.ARGB_8888);
}

【讨论】:

  • 对这个问题没有帮助的答案。没有人会发现这个,而且它在技术上是重复的。
  • @323go 怎么会这样?这部分代码替换了创建位图的部分。它解决了这个问题。
【解决方案2】:

以下是可以涵盖所有情况的代码。

public static Bitmap drawableToBitmap (Drawable drawable) {


    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if (bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
    } else {
        return Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

}

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2011-06-10
    • 2017-11-15
    • 2014-11-11
    • 2019-05-12
    • 2011-02-18
    相关资源
    最近更新 更多