无法获取Drawable文件名,BitmapFactory.decodeResource调用遇阻求助
嘿,我来帮你捋捋这个问题的核心和解决办法~
首先得明确:你用的BitmapFactory.decodeResource(getResources(), R.drawable.xxx)里的R.drawable.xxx是编译时生成的整数资源ID,不是你当初放入drawable目录的原始文件名。Android在编译过程中会把drawable下的文件重命名(比如把my_cat.png改成类似res_drawable_my_cat_123.png这种),所以直接通过资源ID没法反向拿到原始文件名。
下面给你几个实用的解决方案:
手动建立资源ID与文件名的映射表
如果你的drawable资源数量不多,可以自己维护一个HashMap,把每个资源ID和对应的文件名一一绑定,比如:HashMap<Integer, String> drawableNameMap = new HashMap<>(); drawableNameMap.put(R.drawable.cat_photo, "cat_photo.png"); drawableNameMap.put(R.drawable.dog_banner, "dog_banner.jpg");之后需要文件名时,直接通过资源ID从映射表里取值就行,简单直接。
通过Resources API获取资源Entry名
Android的Resources类提供了反向获取资源Entry Name的方法(Entry Name就是你在drawable里的文件名,不带后缀),代码示例:public String getDrawableEntryName(int resId) { try { return getResources().getResourceEntryName(resId); } catch (Resources.NotFoundException e) { e.printStackTrace(); return null; } }拿到Entry Name后,你需要自己补充文件后缀(比如
.png或.jpg),如果不确定后缀,可以提前统一资源的格式,或者结合资源类型做判断。换用Assets目录存储图片(更适合需明确文件名的场景)
如果你把图片放在assets目录下,就能直接通过文件名读取Bitmap,完全绕开资源ID的问题,代码示例:public Bitmap getBitmapFromAssets(String fileName) { try { InputStream inputStream = getAssets().open(fileName); return BitmapFactory.decodeStream(inputStream); } catch (IOException e) { e.printStackTrace(); return null; } }这种方式下,文件名完全由你自己控制,不会被编译修改,保存时直接用这个文件名即可。
另外还要提醒你:保存图片到SD卡需要注意权限问题——Android 10及以上版本,建议用MediaStore保存到公共目录,或者使用应用私有外部存储(无需申请权限);如果是Android 9及以下,需要申请WRITE_EXTERNAL_STORAGE权限并完成动态授权。
内容的提问来源于stack exchange,提问作者sainath pawar




