使用Glide加载图片为Bitmap设置壁纸时报错该如何解决?
Glide加载网络图片设置系统壁纸报错解决方案
核心错误原因
你的原代码存在两处核心问题:
- Glide的
into()方法不支持直接传入空Bitmap对象接收返回值,Glide图片加载为异步操作,必须通过回调接口接收加载完成的Bitmap - 未配置必要的声明权限,且未处理加载失败、空对象等异常场景,极易触发空指针或语法报错
解决步骤
1. 配置声明权限
首先在AndroidManifest.xml中添加必要权限,这两个权限均为普通权限,无需动态申请:
<!-- 加载网络图片所需的网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 设置系统壁纸权限 --> <uses-permission android:name="android.permission.SET_WALLPAPER" />
2. 修改加载逻辑
以下是适配Glide 4.x版本的正确实现,通过CustomTarget异步接收加载完成的Bitmap后再执行壁纸设置操作:
String leo = "MY LINK FOR IMAGE"; Glide.with(show_wallpaper.this) .asBitmap() // 指定加载格式为Bitmap .load(leo) .into(new CustomTarget<Bitmap>() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { WallpaperManager wallpaperManager = WallpaperManager.getInstance(show_wallpaper.this); try { // 可选:适配当前设备屏幕尺寸裁剪Bitmap,降低内存占用避免设置失败 int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; Bitmap scaledBitmap = Bitmap.createScaledBitmap(resource, screenWidth, screenHeight, true); // 设置为主屏幕壁纸 wallpaperManager.setBitmap(scaledBitmap); // 回收无用Bitmap避免内存泄漏 if (resource != scaledBitmap) { resource.recycle(); } scaledBitmap.recycle(); } catch (IOException ex) { ex.printStackTrace(); } } @Override public void onLoadCleared(@Nullable Drawable placeholder) { // 资源被清理时的回调,可按需实现逻辑 } @Override public void onLoadFailed(@Nullable Drawable errorDrawable) { super.onLoadFailed(errorDrawable); // 图片加载失败时的异常处理,可添加用户提示 } });
注意事项
- 如果你使用的是Glide 3.x版本,将上述代码中的
CustomTarget<Bitmap>替换为SimpleTarget<Bitmap>即可,其余逻辑基本一致 - 针对Android 12及以上系统,如需同时设置锁屏壁纸,可调用
wallpaperManager.setBitmap(bitmap, null, true, WallpaperManager.FLAG_LOCK) - 大尺寸图片加载建议开启Glide的磁盘缓存配置,避免重复加载消耗流量
内容的提问来源于stack exchange,提问作者Muhammad Umar
相关产品推荐
相关产品推荐

