You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法获取Drawable文件名,BitmapFactory.decodeResource调用遇阻求助

解决BitmapFactory.decodeResource无法获取Drawable文件名的问题

嘿,我来帮你捋捋这个问题的核心和解决办法~

首先得明确:你用的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

火山引擎 最新活动