Android glide加载本地图片遇到的问题

在Android开发中,使用Glide加载本地图片时遇到无法显示的问题。问题根源在于图片路径的设置,不应使用绝对路径。通过生成图片并保存到SD卡,然后尝试在其他地方调用Glide加载该图片,发现加载失败。经了解,正确做法是避免使用绝对路径,确保图片路径的正确性。

问题:加载本地图片一直加载不出来,也不知道是哪里出现的问题,以为是图片命名的方式,试了也没用,后面又看了glide的源码发现glide加载本地图片也是用的那样的方法,后面问了下上家同事,郭佬,才发现一开始的问题便是图片路径的问题。

步骤:

首先检查图片路径(不要写绝对路径!!!):

我是将一个ImageView通过模糊度生成一个图片保存到SD卡中,然后再在其他的地方进行调用展示

(一):图片生成并保存

    public static void viewSaveToImage(Context context, View view) {
        view.setDrawingCacheEnabled(true);
        view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        view.setDrawingCacheBackgroundColor(Color.WHITE);

        // 把一个View转换成图片
        Bitmap cachebmp = loadBitmapFromView(view);
        FileOutputStream fos;
        String imagePath = "";
        try {
            // 判断手机设备是否有SD卡
            boolean isHasSDCard = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
            if (isHasSDCard) {
                // SD卡根目录
                File sdRoot = Environment.getExternalStorageDirectory();
                String fileName = getSDPath() +"/" + Calendar.getInstance().getTimeInMillis()+".jpg";//以name存在目录中
                File file = new File(fileName);
//                File file = new File(sdRoot, "wuaisport/" + Calendar.getInstance().getTimeInMillis() + ".jpg");
                Log.e(TAG, "viewSaveToImage filePath   : " + file.getPath());
                SPUtils.getInstance().put(Constants.SKIN_CONFIG_PIC_PATH, file.getAbsolutePath());
                //保存图片后发送广播通知更新数据库
                Uri uri = Uri.fromFile(file);
                context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
                fos = new FileOutputStream(file);
                imagePath = file.getAbsolutePath();
            } else
                throw new Exception("创建文件失败!");
            cachebmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        LogUtil.e("imagePath=" + imagePath);
        view.destroyDrawingCache();
    }

获取SD卡的路径是关键:

    public static String getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()
                .equals(android.os.Environment.MEDIA_MOUNTED);//判断sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();//获取跟目录
        }
        return sdDir.toString();
    }

生成的图片路径:imagePath=/storage/emulated/0/1556246754134.jpg

(二)在其他地方进行展示(使用glide):

Glide.with(context).load(Uri.fromFile(new File(absPicPath))).into(ivCustomeBg);

glide加载本地SD卡图片并进行显示。

Glide 是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有加载本地图片、远程图片、GIF动画等功能。项目地址:https://github.com/bumptech/glide 你也可以直接下载jar包:https://github.com/bumptech/glide/releases 如何使用:创建个ImageView2. 获取图片并填充到ImageView  获取远程图片: Glide.with(this).load("http://www.see-source.com/source/img/logo_01.png").into(iv);   获取本地图片Glide.with(this).load(R.drawable.logo_01).into(iv);  获取GIF动画图片Glide.with(this).load(R.drawable.image02).into(iv);image02.gif是个动画图片具体功能如下:GIF 动画的解码 :通过调用Glide.with(context).load(“图片路径“)方法,GIF动画图片可以自动显示为动画效果。如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片,使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片本地视频剧照的解码: 通过调用Glide.with(context).load(“图片路径“)方法,Glide能够支持Android设备中的所有视频剧照的加载和展示缩略图的支持: 为了减少在同一个view组件里同时加载多张图片的时间,可以调用Glide.with(context).load(“图片路径“).thumbnail(“缩略比例“).into(“view组件“)方法加载一个缩略图,还可以控制thumbnail()中的参数的大小,以控制显示同比例大小的缩略图Activity 生命周期的集成: 当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求转码的支持: Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode() 方法还能够改变图片的样式动画的支持: 新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能OkHttp 和Volley 的支持: 默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈其他功能: 如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能
<think> 首先,用户的问题是:"我想查找使用Glide加载本地图片的方法 请问Glide加载本地图片的实现方法"。这是一个关于如何使用Glide库在Android加载本地图片的具体查询。 从系统指令中,我需要: - 使用行内数学表达式时用$...$格式(但这里可能涉及数学)。 - 独立公式用$$...$$格式(也相关)。 - LaTeX语法正确(确保代码块正确显示)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户提供了几个引用: - 引用[1]:提到Glide可以加载本地GIF图片。 - 引用[2]:关于Glide缓存的使用。 - 引用[3]:Glide的基本用法和优势。 - 引用[4]:预加载和缓存策略。 - 引用[5]:Glide的缓存级别包括源缓存。 用户说这些引用仅供参考,但我需要尽可能参考用户上一次的问题和我的回答。用户的上一次问题是什么?在对话历史中,用户的上一个问题就是这个:"我想查找使用Glide加载本地图片的方法...",所以这是我第一次回答这个具体问题。 现在,构建回答: - 结构清晰,逐步解决问题。 - 确保真实可靠:基于Glide的官方文档或常见用法。 - 使用中文。 - 在回答中,如果需要引用内容,添加引用标识。 关键点:加载本地图片本地图片可能包括文件系统中的图片,如从SD卡或应用资源中加载Glide加载本地图片的方法是: 1. 使用`Glide.with(context)`开始。 2. 使用`.load()`方法指定图片源。 - 对于本地文件:`.load(new File("path/to/image.jpg"))` - 对于资源ID:`.load(R.drawable.image)` - 对于URI:`.load(Uri.parse("file:///path/to/image.jpg"))` 3. 链式调用其他方法如`.into(imageView)`来显示图片。 从引用中: - 引用[1]提到Glide加载本地GIF图片是可行的。 - 其他引用关于缓存,但核心方法是`.load()`。 回答结构: 1. 介绍Glide加载本地图片的基本方法。 2. 提供代码示例。 3. 解释常见场景(如加载资源或文件)。 4. 添加相关问题。 5. 在引用末尾添加标识。 代码格式:使用Markdown代码块,如在示例中。 相关问题:基于主题生成几个问题,如缓存优化、错误处理等。 最终回答: - 开始简要解释Glide可以高效加载本地图片。 - 提供代码示例。 - 结束相关问题。 </think> ### Glide加载本地图片的实现方法 Glide是一个强大的Android图片加载库,支持高效加载多种来源的图片,包括本地图片(如设备存储中的文件或应用资源)。实现方法主要依赖于Glide的`load()`方法,通过指定本地文件路径、资源ID或URI来加载图片。以下是逐步说明和代码示例: #### 基本步骤 1. **初始化Glide上下文**:使用`Glide.with(context)`创建请求管理器。 2. **指定图片源**:使用`.load()`方法传入本地文件路径(`File`对象)、资源ID(如`R.drawable.image`)或URI(如`file://`格式字符串)。 3. **可选配置**:可以添加缓存策略、占位符等优化。 4. **显示图片**:使用`.into()`方法将图片加载到目标ImageView。 #### 代码示例 以下是一个完整的示例代码,展示如何加载同类型的本地图片: ```java import android.net.Uri; import android.widget.ImageView; import com.bumptech.glide.Glide; import java.io.File; // 示例1:加载本地文件(如SD卡中的图片) public void loadLocalFile(ImageView imageView, String filePath) { File imageFile = new File(filePath); // 例如:"/sdcard/Pictures/image.jpg" Glide.with(imageView.getContext()) .load(imageFile) // 指定本地文件对象 .into(imageView); // 显示到ImageView // 使用File对象加载本地图片[^1] } // 示例2:加载应用资源图片(如res/drawable中的图片) public void loadResourceImage(ImageView imageView, int drawableId) { Glide.with(imageView.getContext()) .load(drawableId) // 指定资源ID,例如R.drawable.local_image .placeholder(R.drawable.placeholder) // 选项:添加占位符 .into(imageView); // Glide支持加载资源ID,简化本地资源使用[^3] } // 示例3:加载URI格式的本地图片(适用于文件或内容提供程序) public void loadLocalUri(ImageView imageView, String uriString) { Uri uri = Uri.parse(uriString); // 例如:"file:///sdcard/Pictures/image.gif" Glide.with(imageView.getContext()) .load(uri) // 指定URI .diskCacheStrategy(DiskCacheStrategy.NONE) // 选项:禁用磁盘缓存(适用于频繁变化的本地图片.into(imageView); } ``` #### 关键注意事项 - **支持格式**:Glide加载本地JPEG、PNG、GIF等常见格式图片。引用[1]中提到,加载本地GIF图片完全可行,无需额外库[^1]。 - **缓存策略**:默认情况下,Glide使用内存和磁盘缓存优化性能。对于本地静态图片,建议使用`.diskCacheStrategy(DiskCacheStrategy.SOURCE)`缓存原始文件以提升加载速度[^4][^5]。如果图片频繁更新(如用户下载的新文件),则禁用缓存(`.diskCacheStrategy(DiskCacheStrategy.NONE)`)。 - **错误处理**:添加`.error(R.drawable.error_image)`可在加载失败时显示错误占位符。 - **性能优化**:Glide的三级缓存机制(包括源缓存)确保本地图片加载高效,减少处理开销[^5]。引用[3]强调其API简洁性,使代码易于维护[^3]。 如果遇到问题(如加载失败),检查文件路径权限(确保`READ_EXTERNAL_STORAGE`权限已授权)或路径格式是否正确。Glide会自动处理图片解码和缩放,无需手动管理内存。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值