默认锁屏壁纸无效问题
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加载方式
- 需要注释掉加载系统壁纸的代码,因为这里是加载锁屏壁纸
- 注意selectedUser有时候会null,我们只需要mCurrentUserId,selectedUser.getIdentifier()返回本身就是mCurrentUserId
- 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. */
默认锁屏壁纸无效问题相关推荐
- Android N默认锁屏壁纸的实现
从Android N开始,原生系统增加了锁屏壁纸开关: frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/pho ...
- win7自动换锁屏壁纸
2019独角兽企业重金招聘Python工程师标准>>> 系统是win7用了4年都没重装过,公司有要求要设置密码.设置了10分钟不用自动锁屏. 有一天发呆着发呆着,突然觉得,每天都看这 ...
- 华为主题锁屏壁纸换不掉_快来看看华为与荣耀手机的这16款主题!别一直用系统默认主题啦!...
现在华为及荣耀手机十分受欢迎,在这样的大背景下,大家的手机就会经常与别人"撞机",撞机其实是难免的,毕竟华为系手机卖得太火了,但我们可以通过更换自己手机的主题,来增加自己手机的辨识 ...
- 如何保存window10锁屏壁纸
首先找到存放window10的锁屏壁纸文件夹,方法如下: 1.同时点击键盘上的组合键"Win+R",调出"运行"窗口,在输入框内复制下面的内容并粘贴,点回车按钮 ...
- windows技巧--win7修改锁屏壁纸(不用软件)
今天看电脑的锁屏壁纸感觉不好玩,就自己在网上找了一下修改电脑锁屏壁纸的方法,搜索结果如下: 1. 进入注册表(在运行框中输入regedit),找到 "HKEY_LOCAL_MACHINE\S ...
- 锁定计算机 背景图片,win7系统电脑更换锁屏壁纸的方法
当win7系统电脑在一段时间不动的话就进入锁屏状态,然而很多用户觉得默认的锁屏壁纸不好看,就想要更换自己喜欢的锁屏壁纸,那么win7怎么更换锁屏壁纸呢?下面给大家讲解一下win7系统电脑更换锁屏壁纸的 ...
- 阳光系统下载 Win7电脑锁屏壁纸怎么设置
阳光系统下载 Win7电脑锁屏壁纸怎么设置 如果我们在使用电脑的过程中,如果暂时离开了电脑,系统就会自动进入锁屏状态,但是一些用户觉得默认的锁屏壁纸太单调,没有任何美观可言.那么Win7电脑锁屏壁纸怎 ...
- win7计算机锁频图片怎么设置,win7锁屏壁纸怎么换_win7更换锁屏壁纸的操作方法...
我们使用windows7旗舰版系统电脑的时候,如果有一段时间不动电脑的话系统就会自动进入锁屏状态.但有的用户觉得默认的锁屏壁纸太单调,想要换成自己喜欢的.那我们要怎更换呢?下面小编就来给大家分享win ...
- windows聚焦壁纸不更新_Win10无法自动更换聚焦锁屏壁纸怎么办?
Win10无法自动更换聚焦锁屏壁纸怎么办?在Win10系统的默认情况下,锁屏界面设置的是Windows聚焦,如果我们使用微软账户登录,系统会自动更换锁屏壁纸,让我们每天都能看到不一样的锁屏壁纸.然而有 ...
- windows聚焦壁纸不更新_Win10系统下聚焦锁屏壁纸无法自动更换怎么解决
Windows聚焦是Win10系统中的一种新功能,意在锁屏不再有单调的锁屏壁纸,但是很多win10系统用户在设置聚焦锁屏壁纸之后却发现无法自动更换,遇到这样的问题该怎么办呢,本文就给大家讲解一下Win ...
最新文章
- 解析 mysql_MySQL的sql解析
- ACM常用之 异或运算的性质。
- DoNet 高效开发必备开发工具
- MapReduce 中的两表 join 几种方案简介
- 微信小程序周报(第八期)
- Highcharts custom renderer chart and tooltip
- windows配置mysql5.6免安装版
- C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
- HTML5离线存储 初探
- 【论文笔记】Learning Deep Face Representation
- 你们心心念念的 GitHub 客户端终于来了!
- 音乐频率的划分及播放器均衡器设置
- ssh远程访问控制(一)
- python 批量视频编辑_python实现批量视频分帧、保存视频帧
- 在Tiled Map中使用碰撞检测
- OBS更改标题?标题一改,安能辨我是雌雄?
- STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程
- 关于resharper激活
- c语言随机产生一组四则运算题,随机生成四则运算
- java 获取星期_java中如何获取日期时间中的星期几?
热门文章
- clodop 打印插件打印不显示问题
- 【代码笔记】RRDNet 网络
- 一个dsp最小系统至少要有_DSP原理及应用(2812)试卷_附答案卷B2(2015城南)
- vba 位 前 相似 筛选_Excel VBA复制筛选的当前区域可见单元格,但排除最后3列
- 使用最小二乘法计算机器学习算法之线性回归(计算过程与python实现)
- 01使用ILDasm.exe将可执行文件反编译成IL代码
- Ubuntu 修改 谷歌输入法 简繁体切换的快捷键
- inav是什么意思?
- 神经网络学习小记录59——Pytorch搭建常见分类网络平台(VGG16、MobileNetV2、ResNet50)
- 西电电子线路实验课程设计通关模板