1

기기에 설치된 모든 앱 (appName, packageName, appIcon 및 일부 appDetails)의 세부 정보를 프로그래밍 방식으로 수집하는 앱을 구축 중입니다.설치된 모든 앱의 앱 아이콘을 프로그래밍 방식으로 저장 및 검색

그러나 데이터 구조에서 이러한 앱 세부 정보를 가져 와서 저장하는 것은 지각 할 수있는 시간이 걸리는 것으로 나타났습니다. SharedPreferences을 사용하여 앱 세부 정보 중 일부를 저장하려고 했으므로 다른 앱 실행간에 데이터를 유지할 수 있고 앱을 시작할 때마다 가져 오기를 시작하지 않을 수 있습니다.

그러나 앱 아이콘 (드로어 블)을 저장하는 데 많은 공간이 필요하며 앱 설치 후 위의 앱 데이터를 유지하는 데 더 효율적인 방법이 있는지 궁금합니다. 설치된 앱이 프로그래밍 방식으로 가져온 마지막 시간입니다.

그래서 내 질문은 은 앱 아이콘 (드로어 블)을 저장하는 효율적인 방법으로 너무 많은 공간을 차지하지 않으며 동시에 앱 세트를 서로 다른 것으로 유지할 수 있습니다 (). 앱 실행?

답변

0

귀하의 가장 좋은 기회는 App 데이터베이스에 설치된 Apps 목록을 저장하는 것입니다. 앱의 드로어 블 아이콘을 인코딩 된 문자열로 저장할 수 있습니다.

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

아이콘을 String으로 변환하고 Parceler를 사용하여 파일에 저장하면됩니다. 그래서

  1. 을 위해 저장 될 모든 아이콘이 클래스 형의 ArrayList를 초기화 클래스 Parcelable
  2. 확인 비트 맵 형식
  3. 의 속성으로 아이콘 앱 POJO 클래스를 만듭니다
  4. 소포 이러한 개체를 파일에 저장하십시오.

이제 Bitmap 유형의 속성은 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; 
    } 
}