【问题标题】:Storing and retrieving app icons of all installed apps programmatically以编程方式存储和检索所有已安装应用程序的应用程序图标
【发布时间】:2016-09-26 14:19:26
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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;
    }
    

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

    【讨论】:

      【解决方案2】:

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

      1. 创建一个App POJO类,图标作为Bitmap类型的属性
      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);
      }
      

      以及以下函数将数据转换回位图类型。

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        相关资源
        最近更新 更多