Android加载Drawable资源遇IOException:资源未找到问题求助
解决Android加载Drawable中BMP资源的IOException问题
问题原因
Android系统会对res/drawable目录下的图片资源做优化处理(比如自动转换格式、压缩),导致原始BMP文件并非以你预期的路径或原始形式存在,这就是用ContentResolver通过Uri访问时提示“资源不存在”的核心原因。
解决方案
把BMP资源移到res/raw目录(如果没有这个目录,手动创建即可),该目录下的资源会原封不动打包进APK,不会被系统修改。之后直接通过Resources.openRawResourceFd获取文件描述符,无需构造复杂的Uri。
修改后的代码示例
try (AssetFileDescriptor assetFileDescriptor = getResources().openRawResourceFd(R.raw.lenna_512x512)) { ParcelFileDescriptor parcelFileDescriptor = assetFileDescriptor.getParcelFileDescriptor(); int fd = parcelFileDescriptor.getFd(); tv.setText(imageProcLoadNeon(fd)); parcelFileDescriptor.close(); } catch (IOException ioException) { Toast.makeText(getApplicationContext(),"Image load failed",Toast.LENGTH_SHORT).show(); ioException.printStackTrace(); Log.e("MyCrappyApp", "image load error: " + ioException.getMessage()); }
额外说明
- 若一定要用
drawable目录,可尝试通过getResources().openRawResource(R.drawable.lenna_512x512)获取InputStream,但这种方式无法直接拿到文件描述符,可能不匹配你的imageProcLoadNeon方法需求。 - 移动资源后记得清理并重新构建项目,避免缓存干扰。
内容的提问来源于stack exchange,提问作者Ishank Rawat
相关产品推荐
相关产品推荐

