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
相关产品推荐
相关产品推荐

