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

时间:2016-09-26 14:19:27

标签: android android-package-managers android-sharedpreferences

我正在构建一个应用程序,我在其中以编程方式收集设备上安装的所有应用程序的详细信息(appName,packageName,appIcon和其他一些appDetails)。

但是,我发现在数据结构中获取和存储这些应用程序详细信息需要花费大量时间。我已经尝试使用 SharedPreferences 存储一些应用程序详细信息,以便我可以在不同的应用程序执行之间保留数据,而不是每次启动应用程序时都启动提取。

然而,存储应用程序图标(drawables)占用了大量空间,让我想知道是否有更有效的方法在应用程序执行之间保留上述应用程序数据,除非当然在安装新应用程序之后安装上次安装的应用程序是以编程方式获取的。

所以,我的问题是,是否有一种有效的方式来存储应用程序图标(drawables),这样他们就不会占用太多空间,同时,应用程序可以在不同的应用程序执行之间保留set吗?

2 个答案:

答案 0 :(得分:0)

我相信您的最佳照片是保存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;
}

然后,您可以在应用程序数据库中存储应用程序的详细信息。

答案 1 :(得分:0)

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

  1. 使用图标作为位图类型
  2. 的属性创建一个App POJO
  3. 上课Parcelable
  4. 使用要存储的所有图标初始化此类类型的ArrayList
  5. 将这些对象包装并存储在文件中
  6. 现在,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;
        }
    }