Android SDK 35中BitmapFactory.decodeStream()不再支持GIF?求解决方案
Android 35+ 中 BitmapFactory.decodeStream() 处理GIF返回null的问题解析
问题本质
Android 35(API Level 35)及以上版本中,BitmapFactory.decodeStream() 对 image/gif 类型文件返回null,这是预期变更——属于Android平台对图片解码逻辑的规范调整。此前该方法会隐式处理单帧GIF并返回Bitmap,但从API 35开始,系统严格区分静态图片(如PNG/JPG)和动态图片(如GIF/WebP动图)的解码路径,BitmapFactory 不再负责解码GIF格式内容,无论是否为单帧。
对第三方库的影响
包括Picasso在内的多个图片加载缓存库,因依赖 BitmapFactory.decodeStream() 处理图片流,在API 35+设备上加载GIF时会出现解码失败,尤其是单帧GIF这类此前能正常处理的资源。
最佳规避方案
提取GIF首帧是可行方案之一,但更推荐以下两种适配性更强的方式:
- 升级图片加载库:使用适配API 35解码逻辑的新版本库,比如Picasso的后续更新版本(若已完成适配),或切换到Glide、Coil等对动态图片解码支持更完善的库——这类库内置独立的GIF解码逻辑,不依赖系统
BitmapFactory处理GIF。 - 手动处理GIF解码:若需继续使用旧版库或自定义解码逻辑,可借助
android.graphics.gif.GifDecoder类(API 28+引入)解析GIF流并提取首帧Bitmap:val inputStream = ... // GIF文件输入流 val gifDecoder = GifDecoder() gifDecoder.read(inputStream) val firstFrameBitmap = gifDecoder.getFrame(0) // 使用Bitmap后记得按需回收
注:你提到的示例资源为单帧GIF,在API 35前可被
BitmapFactory解码,现在需通过上述方式处理。
内容的提问来源于stack exchange,提问作者alexgophermix
相关产品推荐
相关产品推荐

