以编程方式存储和检索所有已安装应用程序的应用程序图标

tsint 发布于 4 天前 android 最后更新 4 天前 1 浏览

我正在构建一个应用程序,以编程方式收集设备上安装的所有应用程序(appName,packageName,appIcon和其他一些appDetails)的详细信息。 但是,我观察到,将这些应用程序细节提取并存储在数据结构中需要花费大量的时间。我曾尝试使用SharedPreferences存储一些应用程序详细信息,以便我可以在不同的应用程序执行之间保留数据,并且每次启动应用程序时都不会启动提取。 然而,存储应用程序图标(可绘制)会占用大量空间,并且让我怀疑在应用程序执行之间是否有更有效的方式来保留上述应用程序数据,除非上次安装新应用程序后已安装的应用程序以编程方式提取。 所以,我的问题是,是否有一种高效的存储应用程序图标(可绘制)的方式,使它们不占用太多空间,同时,应用程序集可以保留在不同的应用程序执行之间?

已邀请:

oiusto

赞同来自:

这可以通过将图标转换为String并使用Parceler将它们存储在文件中来完成。为此,

  1. 使用图标作为位图类型的属性创建应用程序POJO
  2. 上课Parcelable
  3. 使用要存储的所有图标初始化此类类型的ArrayList
  4. 将这些对象包装并存储在文件中
现在,Bitmap类型的属性不是Parcelable,因此您必须将它们转换为parcelable类型。您可以使用此功能进行转换:
static String bitMapToString(Bitmap bitmap) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
}
并且以下函数将数据转换回Bitmap类型。
static Bitmap stringToBitMap(String encodedString) {
    try {
        byte[] encodeByte = Base64.decode(encodedString, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
    } catch (Exception e) {
        e.getMessage();
        return null;
    }
}

ret

赞同来自:

我相信您的最佳镜头是保存App数据库中安装的应用程序列表。您可以将应用程序的可绘制图标存储为编码字符串。

String image = getImageFromDrawable(app.loadIcon(pm));
app是ApplicationInfo,pm是PackageManager。
public String getImageFromDrawable(Drawable drawable){
    String img = null;
    if(drawable instanceof  BitmapDrawable) {
        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] arr = stream.toByteArray();
        img = Base64.encodeToString(arr, Base64.URL_SAFE);
        return img;
    }
    return null;
}
然后,您可以在应用程序数据库中存储应用程序的详细信息。