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

Android:保存图片后resources.getIdentifier始终返回0问题求助

问题根源分析

你遇到的核心问题是存储位置与检索方式完全不匹配:

  • 你用ContextWrapper.getDir()保存的图片,存在应用内部存储的私有文件目录里(属于动态生成的本地文件,不是APK打包时的内置资源);
  • 而resources.getIdentifier()是专门用来查找res/drawable等资源目录下、打包进APK的静态资源ID的,它根本不会去扫描你的应用私有文件目录,所以必然返回0。
正确的图片检索方案

既然图片是保存在私有文件目录,那我们需要直接从文件系统加载Bitmap,再设置给ImageView。以下是完整的修正代码:

1. 编写加载保存图片的工具方法

private fun loadSavedCategoryImage(categoryName: String): Bitmap? {
    // 复用保存时的目录路径,确保路径完全一致
    val cw = ContextWrapper(applicationContext)
    val directory = cw.getDir("imageDir", Context.MODE_PRIVATE)
    val fileName = Utility().replaceSpaces(categoryName) + ".png"
    val targetFile = File(directory, fileName)

    return try {
        // 如果文件存在,直接解码文件为Bitmap
        if (targetFile.exists()) {
            BitmapFactory.decodeFile(targetFile.absolutePath)
        } else {
            // 文件不存在时返回默认图标
            BitmapFactory.decodeResource(resources, R.drawable.appicon)
        }
    } catch (e: Exception) {
        // 捕获文件损坏、解码失败等异常,避免崩溃
        e.printStackTrace()
        BitmapFactory.decodeResource(resources, R.drawable.appicon)
    }
}

2. 加载图片并设置给ImageView

val imageView = ImageView(this)
val displayBitmap = if (category.isEmpty()) {
    // 分类为空时直接用默认图标
    BitmapFactory.decodeResource(resources, R.drawable.appicon)
} else {
    // 加载保存的图片,失败则回退到默认图标
    loadSavedCategoryImage(category) ?: BitmapFactory.decodeResource(resources, R.drawable.appicon)
}
imageView.setImageBitmap(displayBitmap)
额外注意事项
  • 确保category和保存时的categoryName内容一致:你保存时用categoryName生成文件名,检索时用category,要保证两者经过replaceSpaces处理后完全相同,否则会找不到文件;
  • 权限问题:因为是应用私有目录,不需要申请READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,系统默认允许应用访问自己的私有目录;
  • 性能优化:如果图片较大,建议在子线程中加载Bitmap,避免阻塞主线程导致UI卡顿。

内容的提问来源于stack exchange,提问作者Anand Vasudevan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:52:43