如何读取SQLite存储的图片文件路径并在ImageView中显示
问题根因
你遇到的报错核心原因是读取数据库字段时的类型处理错误:
你在建表时将存储图片路径的FIELD_IMG字段定义为text字符串类型,但在onLoadFinished方法中,你将接收路径的img变量定义为double类型,同时调用getDouble()方法读取字符串格式的路径,最终导致路径被强制转换为数值0.0,系统自然无法找到名为0.0的文件。
修复步骤
1. 修正路径读取逻辑
把onLoadFinished方法中的路径相关代码替换为正确的字符串读取逻辑:
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { int locationCount = 0; double lat = 0; double lng = 0; float zoom = 0; // 将接收路径的变量改为字符串类型 String imgPath = ""; locationCount = arg1.getCount(); if(locationCount == 0) return; arg1.moveToFirst(); for (int i = 0; i < locationCount; i++) { lat = arg1.getDouble(arg1.getColumnIndexOrThrow(LocationsDB.FIELD_LAT)); lng = arg1.getDouble(arg1.getColumnIndexOrThrow(LocationsDB.FIELD_LNG)); zoom = arg1.getFloat(arg1.getColumnIndexOrThrow(LocationsDB.FIELD_ZOOM)); // 用getString方法读取字符串类型的路径字段 imgPath = arg1.getString(arg1.getColumnIndexOrThrow(LocationsDB.FIELD_IMG)); LatLng location = new LatLng(lat, lng); drawMarker(location); arg1.moveToNext(); } mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lng))); mMap.animateCamera(CameraUpdateFactory.zoomTo(zoom)); // 直接传入路径字符串解析图片 Bitmap myBitmap = BitmapFactory.decodeFile(imgPath); ImageView myImage = (ImageView) findViewById(R.id.imageView); myImage.setImageBitmap(myBitmap); }
建议使用getColumnIndexOrThrow替代getColumnIndex,可以在字段名写错时直接抛出明确异常,避免隐藏空指针问题。
2. 可选:修正冗余的存储路径
你当前的代码中cameraFolder已经指向MapImages目录,创建photo文件时又额外加了一层MapImages/前缀,导致最终路径出现两层MapImages,可以调整为更简洁的写法:
// 去掉多余的MapImages前缀 File photo = new File(cameraFolder, imageFileName + ".jpg");
3. 权限适配
不同Android版本需要申请对应的存储权限,否则即使路径正确也会读取失败:
- Android 6.0-12版本:动态申请
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限 - Android 13及以上版本:动态申请
READ_MEDIA_IMAGES权限
4. 加载优化(推荐)
直接使用BitmapFactory.decodeFile加载大尺寸拍摄照片很容易触发OOM(内存溢出),建议自行添加采样率压缩逻辑,或者直接使用Glide、Coil等成熟的图片加载库,自动处理压缩、缓存、线程调度:
以Glide为例,加载本地路径仅需一行代码:
Glide.with(this) .load(imgPath) .into(myImage);
内容的提问来源于stack exchange,提问作者user14568805
相关产品推荐
相关产品推荐

