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 supportedwhichProp = 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.javamodified:   base/packages/SystemUI/src/com/android/systemui/ImageWallpaper.javamodified:   base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.javamodified:   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 getBitmapAsUser(mContext.getUserId());}/*** Like {@link #getDrawable()} but returns a Bitmap for the provided user.** @hide*/public Bitmap getBitmapAsUser(int userId) {return sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM, userId);}

在getBitmapAsUser只会传入FLAG_SYSTEM,见:peekWallpaperBitmap(mContext, true, FLAG_SYSTEM, userId);所以要在加载锁屏壁纸这个逻辑要修改(后面修改)

然后进入peekWallpaperBitmap,代码如下

        public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault,@SetWallpaperFlags int which, int userId) {....if (returnDefault) {Bitmap defaultWallpaper = mDefaultWallpaper;if (defaultWallpaper == null) {
;defaultWallpaper = getDefaultWallpaper(context, which);synchronized (this) {mDefaultLockWallpaper = defaultWallpaper;}}return defaultWallpaper;}return null;}

这个只有一个mDefaultLockWallpaper,所以在保存的时候只会保存一个,因为要想锁屏壁纸和系统壁纸都有效,必须分别加载,这里也要修改.(后面修改)

最后到openDefaultWallpaper方法

    public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) {....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;}final String path = SystemProperties.get(whichProp);if (!TextUtils.isEmpty(path)) {final File file = new File(path);if (file.exists()) {try {return new FileInputStream(file);} catch (IOException e) {// Ignored, fall back to platform default below}}}try {return context.getResources().openRawResource(defaultResId);} catch (NotFoundException e) {// no default defined for this device; this is not a failure}return null;}

which == FLAG_LOCK已经被注解了,需要去掉注解,去掉retrun null;(后面修改)

增加配置默认锁屏壁纸功能

step 1 :打开锁屏壁纸加载开关

SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
打开加载锁屏壁纸开关

-    private static final boolean ENABLE_LOCKSCREEN_WALLPAPER = SystemProperties.getBoolean("ro.lockwallpaper.enable", true);
+    private static final boolean ENABLE_LOCKSCREEN_WALLPAPER = true;
step 2 :修改加载锁屏壁纸方式,使得加载与系统壁纸区分

SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
修改LockscreenWallpaper加载方式

  1. 需要注释掉加载系统壁纸的代码,因为这里是加载锁屏壁纸
  2. 注意selectedUser有时候会null,我们只需要mCurrentUserId,selectedUser.getIdentifier()返回本身就是mCurrentUserId
  3. getLockBitmapAsUser方法是后面添加WallpaperManager中的.
step 3 : wallpaperManager加载锁屏壁纸

base/core/java/android/app/WallpaperManager.java


上面方法是原来的加载的方法,现在只做系统壁纸加载,后面添加的方法做锁屏壁纸加载

修改:WallpaperManager内部类Globals的方法peekWallpaperBitmap


这样就能保存锁屏和系统两种不同的默认壁纸了

修改:WallpaperManager内部类Globals的方法openDefaultWallpaper

按照如上修改,系统就能分别配置锁屏和默认壁纸了

修改的patch

其他平台和android版本修改应该大同小异

下面是3个文件的修改patch

diff --git a/base/core/java/android/app/WallpaperManager.java b/base/core/java/android/app/WallpaperManager.java
index 8a375cd44..2cb77e88d 100644
--- a/base/core/java/android/app/WallpaperManager.java
+++ b/base/core/java/android/app/WallpaperManager.java
@@ -284,6 +284,7 @@ public class WallpaperManager {private Bitmap mCachedWallpaper;private int mCachedWallpaperUserId;private Bitmap mDefaultWallpaper;
+        private Bitmap mDefaultLockWallpaper;private Handler mMainLooperHandler;Globals(Looper looper) {
@@ -393,6 +394,7 @@ public class WallpaperManager {public Bitmap peekWallpaperBitmap(Context context, boolean returnDefault,@SetWallpaperFlags int which, int userId) {
+if (mService != null) {try {if (!mService.isWallpaperSupported(context.getOpPackageName())) {
@@ -427,11 +429,15 @@ public class WallpaperManager {}}if (returnDefault) {
-                Bitmap defaultWallpaper = mDefaultWallpaper;
+                Bitmap defaultWallpaper = (which == FLAG_LOCK) ? mDefaultLockWallpaper : mDefaultWallpaper;if (defaultWallpaper == null) {defaultWallpaper = getDefaultWallpaper(context, which);synchronized (this) {
-                        mDefaultWallpaper = defaultWallpaper;
+                        if(which == FLAG_LOCK) {
+                            mDefaultLockWallpaper = defaultWallpaper;
+                        } else {
+                            mDefaultWallpaper = defaultWallpaper;
+                        }}}return defaultWallpaper;
@@ -831,6 +837,17 @@ public class WallpaperManager {return sGlobals.peekWallpaperBitmap(mContext, true, FLAG_SYSTEM, userId);}+    /**
+     * Like {@link #getDrawable()} but returns a Bitmap for the provided user.
+     *
+     * @hide
+     */
+    public Bitmap getLockBitmapAsUser(int userId) {
+        Log.i("wangcan","wallpapseManager-getLockBitmapAsUser FLAG_LOCK");
+        return sGlobals.peekWallpaperBitmap(mContext, true, FLAG_LOCK, userId);
+    }
+
+/*** Get an open, readable file descriptor to the given wallpaper image file.* The caller is responsible for closing the file descriptor when done ingesting the file.
@@ -1829,11 +1846,10 @@ public class WallpaperManager {final String whichProp;final int defaultResId;if (which == FLAG_LOCK) {
-            /* Factory-default lock wallpapers are not yet supported
+            /* Factory-default lock wallpapers are not yet supported*/whichProp = PROP_LOCK_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_lock_wallpaper;
-            */
-            return null;
+            //return null;} else {whichProp = PROP_WALLPAPER;defaultResId = com.android.internal.R.drawable.default_wallpaper;
diff --git a/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
index e44a47220..25993c55b 100644
--- a/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
+++ b/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
@@ -109,10 +109,10 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemenselectedUser != null ? selectedUser.getIdentifier() : currentUserId;ParcelFileDescriptor fd = mWallpaperManager.getWallpaperFile(WallpaperManager.FLAG_LOCK, lockWallpaperUserId);
-        if (fd == null && mBar.getPowerSaveModeInternal() == PowerManagerEx.MODE_ULTRASAVING) {
-            fd = mWallpaperManager.getWallpaperFile(
-                WallpaperManager.FLAG_SYSTEM, lockWallpaperUserId);
-        }
+        //if (fd == null && mBar.getPowerSaveModeInternal() == PowerManagerEx.MODE_ULTRASAVING) {
+        //    fd = mWallpaperManager.getWallpaperFile(
+        //        WallpaperManager.FLAG_SYSTEM, lockWallpaperUserId);
+        //}if (fd != null) {try {BitmapFactory.Options options = new BitmapFactory.Options();
@@ -128,11 +128,13 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemenif (selectedUser != null) {// Show the selected user's static wallpaper.return LoaderResult.success(
-                        mWallpaperManager.getBitmapAsUser(selectedUser.getIdentifier()));
+                        mWallpaperManager.getLockBitmapAsUser(selectedUser.getIdentifier()));} else {// When there is no selected user, show the system wallpaper
-                return LoaderResult.success(null);
+                //return LoaderResult.success(null);
+                return LoaderResult.success(
+                        mWallpaperManager.getLockBitmapAsUser(mCurrentUserId));}}}
diff --git a/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 22d0bed37..b9ee91f84 100644
--- a/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -381,7 +381,7 @@ public class StatusBar extends SystemUI implements DemoMode,private static final boolean ONLY_CORE_APPS;/** If true, the lockscreen will show a distinct wallpaper */
-    private static final boolean ENABLE_LOCKSCREEN_WALLPAPER = SystemProperties.getBoolean("ro.lockwallpaper.enable", true);
+    private static final boolean ENABLE_LOCKSCREEN_WALLPAPER = true;/* If true, the device supports freeform window management.* This affects the status bar UI. */

默认锁屏壁纸无效问题相关推荐

  1. Android N默认锁屏壁纸的实现

    从Android N开始,原生系统增加了锁屏壁纸开关: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pho ...

  2. win7自动换锁屏壁纸

    2019独角兽企业重金招聘Python工程师标准>>> 系统是win7用了4年都没重装过,公司有要求要设置密码.设置了10分钟不用自动锁屏. 有一天发呆着发呆着,突然觉得,每天都看这 ...

  3. 华为主题锁屏壁纸换不掉_快来看看华为与荣耀手机的这16款主题!别一直用系统默认主题啦!...

    现在华为及荣耀手机十分受欢迎,在这样的大背景下,大家的手机就会经常与别人"撞机",撞机其实是难免的,毕竟华为系手机卖得太火了,但我们可以通过更换自己手机的主题,来增加自己手机的辨识 ...

  4. 如何保存window10锁屏壁纸

    首先找到存放window10的锁屏壁纸文件夹,方法如下: 1.同时点击键盘上的组合键"Win+R",调出"运行"窗口,在输入框内复制下面的内容并粘贴,点回车按钮 ...

  5. windows技巧--win7修改锁屏壁纸(不用软件)

    今天看电脑的锁屏壁纸感觉不好玩,就自己在网上找了一下修改电脑锁屏壁纸的方法,搜索结果如下: 1. 进入注册表(在运行框中输入regedit),找到 "HKEY_LOCAL_MACHINE\S ...

  6. 锁定计算机 背景图片,win7系统电脑更换锁屏壁纸的方法

    当win7系统电脑在一段时间不动的话就进入锁屏状态,然而很多用户觉得默认的锁屏壁纸不好看,就想要更换自己喜欢的锁屏壁纸,那么win7怎么更换锁屏壁纸呢?下面给大家讲解一下win7系统电脑更换锁屏壁纸的 ...

  7. 阳光系统下载 Win7电脑锁屏壁纸怎么设置

    阳光系统下载 Win7电脑锁屏壁纸怎么设置 如果我们在使用电脑的过程中,如果暂时离开了电脑,系统就会自动进入锁屏状态,但是一些用户觉得默认的锁屏壁纸太单调,没有任何美观可言.那么Win7电脑锁屏壁纸怎 ...

  8. win7计算机锁频图片怎么设置,win7锁屏壁纸怎么换_win7更换锁屏壁纸的操作方法...

    我们使用windows7旗舰版系统电脑的时候,如果有一段时间不动电脑的话系统就会自动进入锁屏状态.但有的用户觉得默认的锁屏壁纸太单调,想要换成自己喜欢的.那我们要怎更换呢?下面小编就来给大家分享win ...

  9. windows聚焦壁纸不更新_Win10无法自动更换聚焦锁屏壁纸怎么办?

    Win10无法自动更换聚焦锁屏壁纸怎么办?在Win10系统的默认情况下,锁屏界面设置的是Windows聚焦,如果我们使用微软账户登录,系统会自动更换锁屏壁纸,让我们每天都能看到不一样的锁屏壁纸.然而有 ...

  10. windows聚焦壁纸不更新_Win10系统下聚焦锁屏壁纸无法自动更换怎么解决

    Windows聚焦是Win10系统中的一种新功能,意在锁屏不再有单调的锁屏壁纸,但是很多win10系统用户在设置聚焦锁屏壁纸之后却发现无法自动更换,遇到这样的问题该怎么办呢,本文就给大家讲解一下Win ...

最新文章

  1. 解析 mysql_MySQL的sql解析
  2. ACM常用之 异或运算的性质。
  3. DoNet 高效开发必备开发工具
  4. MapReduce 中的两表 join 几种方案简介
  5. 微信小程序周报(第八期)
  6. Highcharts custom renderer chart and tooltip
  7. windows配置mysql5.6免安装版
  8. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
  9. HTML5离线存储 初探
  10. 【论文笔记】Learning Deep Face Representation
  11. 你们心心念念的 GitHub 客户端终于来了!
  12. 音乐频率的划分及播放器均衡器设置
  13. ssh远程访问控制(一)
  14. python 批量视频编辑_python实现批量视频分帧、保存视频帧
  15. 在Tiled Map中使用碰撞检测
  16. OBS更改标题?标题一改,安能辨我是雌雄?
  17. STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程
  18. 关于resharper激活
  19. c语言随机产生一组四则运算题,随机生成四则运算
  20. java 获取星期_java中如何获取日期时间中的星期几?

热门文章

  1. clodop 打印插件打印不显示问题
  2. 【代码笔记】RRDNet 网络
  3. 一个dsp最小系统至少要有_DSP原理及应用(2812)试卷_附答案卷B2(2015城南)
  4. vba 位 前 相似 筛选_Excel VBA复制筛选的当前区域可见单元格,但排除最后3列
  5. 使用最小二乘法计算机器学习算法之线性回归(计算过程与python实现)
  6. 01使用ILDasm.exe将可执行文件反编译成IL代码
  7. Ubuntu 修改 谷歌输入法 简繁体切换的快捷键
  8. inav是什么意思?
  9. 神经网络学习小记录59——Pytorch搭建常见分类网络平台(VGG16、MobileNetV2、ResNet50)
  10. 西电电子线路实验课程设计通关模板