加载应用图标其实非常简单:
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(pkgName.getPkg(), 0);
Drawable drawable = applicationInfo.loadIcon(packageManager)
只是加载应用图标也是一个耗时的过程,需要开子线程进行加载,以前要么使用thread+hander方式或者直接RXJava实现。一次偶然突发奇想,为什么不用glide来实现,毕竟以前的ImageLoader是支持的。只是glide需要自定义模块来实现,glide4.x与以前版本在接口上还是有一些差异,我是基于4.x实现的。如果不了解4.x怎么自定义模块,可以看一下这篇文档上代码:编写定制的 ModelLoader
上代码
GMGlideModule.java
@GlideModule
public class GMGlideModule extends AppGlideModule {
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);
registry.prepend(ApkIconModel.class,InputStream.class,new ApkModelLoaderFactory(context));
}
}
ApkModelLoaderFactory.java
public class ApkModelLoaderFactory implements ModelLoaderFactory<ApkIconModel, InputStream> {
private Context context;
public ApkModelLoaderFactory(Context context) {
this.context = context;
}
@NonNull
@Override
public ModelLoader<ApkIconModel, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {
return new ApkIconModelLoader(context);
}
@Override
public void teardown() {
}
}
ApkIconModelLoader.java
public class ApkIconModelLoader implements ModelLoader<ApkIconModel,InputStream> {
private Context context;
public ApkIconModelLoader(Context context){
this.context = context;
}
@Nullable
@Override
public LoadData<InputStream> buildLoadData(@NonNull ApkIconModel apkIconModel, int width, int height, @NonNull Options options) {
return new LoadData<>(new ObjectKey(apkIconModel.getPkg()),new ApkIconFetcher(context,apkIconModel));
}
@Override
public boolean handles(@NonNull ApkIconModel apkIconModel) {
return true;
}
}
ApkIconFetcher.java
public class ApkIconFetcher implements DataFetcher<InputStream> {
private ApkIconModel pkgName;
private Context context;
private final PackageManager packageManager;
public ApkIconFetcher(Context context, ApkIconModel pkgName){
this.context = context;
this.pkgName = pkgName;
packageManager = context.getPackageManager();
}
@Override
public void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {
ApplicationInfo applicationInfo;
try {
applicationInfo = packageManager.getApplicationInfo(pkgName.getPkg(), 0);
Drawable d = packageManager.getApplicationIcon(applicationInfo); //xxx根据自己的情况获取drawable
BitmapDrawable bd = (BitmapDrawable) d;
Bitmap iconBitmap = bd.getBitmap();
InputStream inputStream = bitmap2InputStream(iconBitmap);
callback.onDataReady(inputStream);
} catch (Exception e) {
e.printStackTrace();
callback.onLoadFailed(e);
}
}
// 将Bitmap转换成InputStream
private InputStream bitmap2InputStream(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return new ByteArrayInputStream(baos.toByteArray());
}
@Override
public void cleanup() {
}
@Override
public void cancel() {
}
@NonNull
@Override
public Class<InputStream> getDataClass() {
return InputStream.class;
}
@NonNull
@Override
public DataSource getDataSource() {
return DataSource.LOCAL;
}
}
ApkIconModel.java
public class ApkIconModel {
private String pkgName;
public ApkIconModel(String pkgName) {
this.pkgName = pkgName;
}
public String getPkg() {
return pkgName;
}
}