【问题标题】:Android Universal Image Loader to get bitmaps from Another app's ResourcesAndroid Universal Image Loader 从另一个应用程序的资源中获取位图
【发布时间】:2015-01-18 12:40:04
【问题描述】:

我知道可以使用以下块引用或类似方法来使用其他应用的位图:

String packageName = "com.some.package";

资源 res = getPackageManager().getResourcesForApplication(packageName);

int resId = res.getIdentifier("some_bitmap_icon", "drawable", packageName);

((BitmapDrawable) res.getDrawable(resId)).getBitmap();

是否有将resresId 传递给Android-Universal-Image-Loader 以直接从第3 方应用加载位图?

或者我必须将位图复制到 SD 卡,然后通过传递 "file:///mnt/sdcard/some_temp_bitmap" 显示它

【问题讨论】:

  • 由于 Universal Image Loader 文档建议您一般不要将其用于资源(“仅在真正需要时才使用 drawable://!始终考虑加载 drawable 的本机方式”),为什么不直接使用问题中的代码?
  • 目前,我正在使用我发布的代码获取大量位图(来自图标包),这已开始导致 OutOfMemoryError。所以我求助于 UIL 的背景图像加载和缓存,希望它可以用于从 3rd 方资源加载.. 但我认为情况并非如此?
  • 我不知道 UIL 是否有外国进程可绘制支持。查看the code,它似乎没有提供这个,至少不是drawable:// 语法的一部分。是否可以创建和注册BaseImageDownloader的子类,我不能说。
  • 感谢您为我指明了正确的方向。我根据您的建议在下面发布了我的解决方案。

标签: android bitmap universal-image-loader


【解决方案1】:

感谢@CommonsWare 为我指明了正确的方向。

我首先扩展BaseImageDownloader,然后覆盖getStreamFromOtherSource

public class CustomImageDownloader extends BaseImageDownloader {
    public CustomImageDownloader(Context context) {
        super(context);
    }

    @Override
    protected InputStream getStreamFromOtherSource(String imageUri, Object extra) {
        if (imageUri.startsWith("thirdparty://")) {
            try {
                String drawableString = imageUri.replace("thirdparty://", "");
                String[] location = drawableString.split("/");

                Resources res = context.getPackageManager().getResourcesForApplication(location[0]);
                return res.openRawResource(Integer.parseInt(location[1]));
            } catch (PackageManager.NameNotFoundException e) {
                return null;
            }
        } else throw new UnsupportedOperationException(imageUri);
    }
}

然后在我的 ImageLoaderConfiguration 中使用:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
    .imageDownloader(new CustomImageDownloader(context))
    .build();
ImageLoader.getInstance().init(config);

那么这只是一个使用启动图像加载器的情况:

ImageLoader.getInstance().displayImage("thirdparty://"+ packageName + "/" + resId, imageView, options);

现在Android universal image loader 可用于从第三方应用加载位图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多