Android O默认锁屏壁纸无效
我们设置android默认壁纸的时候,会替换对应的资源文件,但是android O之后只能配置系统壁纸,锁屏壁纸设置为透明或设置与系统壁纸一样,如果我们要像之前一样单独配置锁屏壁纸需要修改WallpaperManager.关于Android O后面为什么不能设置锁屏壁纸,源码有下面的解释:
frameowrks/base/core/java/android/app/WallpaperManager.java
public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) {
final String whichProp;
final int defaultResId;
if (which == FLAG_LOCK) {
/* Factory-default lock wallpapers are not yet supported
whichProp = PROP_LOCK_WALLPAPER;
defaultResId = com.android.internal.R.drawable.default_lock_wallpaper;
*/
return null;
} else {
whichProp = PROP_WALLPAPER;
defaultResId = com.android.internal.R.drawable.default_wallpaper;
}
........
return null;
}
openDefaultWallpaper方法有一个参数which,它只会有两种类型FLAG_LOCK,FLAG_SYSTEM,分别代表这锁屏壁纸和桌面壁纸(桌面壁纸在SysemUI应用里面).但是源码这里有一个注解"Factory-default lock wallpapers are not yet supported",说明官方不支持设置默认锁屏壁纸,经过发现,默认锁屏就是默认桌面的壁纸,default_lock_wallpaper;是无效.
如果要实现单独配置锁屏和桌面壁纸,需要修改相关代码,在修改之前需要了解加载流程.
默认壁纸加载相关的类
以展讯8.1为例:
展讯8.1直接把默认壁纸透明话,只显示桌面壁纸.从而省略了加载锁屏壁纸的流程,提高了流畅度.所以我们需要先把这个开关打开.
frameowrks/base/package/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
private static final boolean ENABLE_LOCKSCREEN_WALLPAPER = SystemProperties.getBoolean("ro.lockwallpaper.enable", true);
加载锁屏和默认壁纸有相关的4个类
modified: base/core/java/android/app/WallpaperManager.java
modified: base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
modified: base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
modified: base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
功能 | 类,名 | 所属 |
---|---|---|
桌面壁纸(系统壁纸加载类) | ImageWallpaper | SystemUI |
锁屏壁纸加载类 | LockscreenWallpaper | SystemUI |
壁纸加载服务类应用进程端 | ImageWallpaper | frameworks |
壁纸加载服务类系统进程端 | WallpaperManagerService | frameworks |
加载默认壁纸是在"壁纸加载服务类应用进程端"
默认壁纸加载流程
加载默认壁纸是不会调用WallpaperManagerService,只在
在LockscreenWallpaperhe 和ImageWallpaper最终调用getBitmapAsUser如下所示
public Bitmap getBitmap() {
return getBitmapAsUse