默认锁屏壁纸无效问题

在Android O之后,默认锁屏壁纸无法设置,原因是官方不支持。文章详细解析了加载流程,涉及WallpaperManager相关类,并提供了开启锁屏壁纸加载、修改加载方式以及WallpaperManager的patch方案,以实现独立配置锁屏和桌面壁纸。
摘要由CSDN通过智能技术生成

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
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值