1

我建立一个应用程序中,我以编程方式收集安装在设备上的所有应用程序的详细信息的应用程序图标(应用程序名称,的packageName,APPICON,和其他一些appDetails)。存储和检索所有已安装的应用程序编程

然而,我观察到获取和在数据结构中存储这些应用程序的详细信息所花的时间可感知量。我曾尝试使用SharedPreferences,这样我可以保持不同的应用程序执行之间的数据,而不是启动我的应用程序启动每一次读取存储一些应用程序的细节。

然而,存储应用程序图标(可绘制)会占用大量空间,并且让我怀疑是否有更有效的方式来保留应用程序执行之间的上述应用程序数据,除非当然,新应用程序安装后上次安装的应用程序是以编程方式提取的。

所以,我的问题是,有存储应用程序图标(可绘)这样的有效的方式,他们不占用太多空间,并在同一时间,应用程序可以设置不同之间保持应用程序执行?

回答

0

我相信你最好的拍摄是节省安装在您的应用数据库应用程序的列表。您可以将应用程序的可绘制图标作为编码字符串存储。

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

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

0

这可以通过图标转换为字符串并使用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); 
} 

和下面的函数将数据转换回位图型。

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