Glide4.x加载应用图标

加载应用图标其实非常简单:

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;
    }
}
扫描二维码关注公众号,回复: 3933981 查看本文章
 

猜你喜欢

转载自blog.csdn.net/JALLV/article/details/83618504