在 android 上使用 Fresco 库显示来自 SD 卡的图像

Displaying images from SD Card using Fresco library on android

我可以使用 Fresco 图片库显示来自 URL 的图片,如他们的网站所示 -

Uri u = Uri.parse("https://assets-cdn.github.com/images/modules/logos_page/GitHub-Mark.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(u);

如何使用 Fresco 显示 SD 卡中的图像?

查看:

https://dzone.com/articles/displaying-images-sd-card

http://frescolib.org/docs/supported-uris.html#_

这里从 sd 卡加载图像在第一个 link 中解释,如何将它与 fresco 连接在第二个 link 中解释。

获取设备上的文件

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
Uri imageUri= Uri.fromFile(new File(imagePath));// For files on device
draweeView.setImageURI(imageUri);

获取网络上的文件

Uri imageUri = Uri.parse(imagePath);
ImageRequest request = ImageRequest.fromUri(imageUri);
DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setOldController(draweeView.getController()).build();
draweeView.setController(controller);

您只需要使用 res:/ URI 方案,后跟资源的 ID,如下所示:

Uri localImageUri = Uri.parse("res:/" + R.drawable.your_sdcard_image);

simpleDraweeView.setImageURI(localImageUri);

这里是Fresco’s supported URIs.

像这样

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

draweeView.setImageURI(getImageContentUri(context.filepath));

/**
 * Gets the content:// URI  from the given corresponding path to a file
 *
 * @param context
 * @param imageFile
 * @return content Uri
 */
public static Uri getImageContentUri(Context context, java.io.File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[]{MediaStore.Images.Media._ID},
            MediaStore.Images.Media.DATA + "=? ",
            new String[]{filePath}, null);
    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor
                .getColumnIndex(MediaStore.MediaColumns._ID));
        Uri baseUri = Uri.parse("content://media/external/images/media");
        return Uri.withAppendedPath(baseUri, "" + id);
    } else {
        if (imageFile.exists()) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, filePath);
            return context.getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }
}

不过,你可能会遇到这个问题

如果您使用下面给出的 fresco 示例在 RecyclerView 中显示来自 SD 卡或画廊的图像。

     Uri imageUri = Uri.parse("file://"+galleryList.get(position));

    ImageRequest request = ImageRequest.fromUri(imageUri);

    DraweeController controller = Fresco.newDraweeControllerBuilder()
            .setImageRequest(request)
            .setOldController(holder.simpleDraweeViewOne.getController()).build();
    Log.e(TAG, "ImagePath uri " + imageUri);

    holder.simpleDraweeViewOne.setController(controller);

注意: file://用于显示sdcard中的数据。