You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:36:04