前言
最近遇到一个A15系统项目,客户要求修改锁屏界面的默认壁纸,客户提供了一张壁纸图片,但是从A15系统的源代码查看时才知道谷歌已经去掉了相关的代码,已经不支持了,A13和A14系统好像是支持的,A15系统的WallpaperManager.java有明显不支持的提示如下:
frameworks/base/core/java/android/app/WallpaperManager.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static InputStream openDefaultWallpaper(Context context, @SetWallpaperFlags int which) { final String whichProp; final int defaultResId;
whichProp = PROP_WALLPAPER;
if (TextUtils.isEmpty(SystemProperties.get("ro.boot.high_refresh"))) { defaultResId = com.android.internal.R.drawable.default_wallpaper; } else { defaultResId = com.android.internal.R.drawable.default_wallpaper_high_refresh; }
|
方案
所以必须采用其他的方法来实现,具体修改如下:
1.将客户给的锁屏壁纸图片拷贝到源代码中,然后添加一行拷贝代码将图片拷贝到system/media/目录下即可,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| diff --git a/device/sprd/generic_mpool/module/generic/animation/boot/default_lock_wallpaper.png
diff --git a/device/sprd/generic_mpool/module/generic/animation/boot/boot.mk b/device/sprd/generic_mpool/module/generic/animation/boot/boot.mk index 2ad899e3477..9003189e799 100755 --- a/device/sprd/generic_mpool/module/generic/animation/boot/boot.mk +++ b/device/sprd/generic_mpool/module/generic/animation/boot/boot.mk @@ -2,5 +2,6 @@ ANIMATION := device/sprd/generic_mpool/module/generic/animation/boot PRODUCT_COPY_FILES += \ $(ANIMATION)/bootanimation.zip:system/media/bootanimation.zip \ + $(ANIMATION)/default_lock_wallpaper.png:system/media/default_lock_wallpaper.png # $(ANIMATION)/sound.mp3:system/media/bootsound.mp3
|
- 到packages/apps/Settings/src/com/android/settings/SettingsInitialize.java这个类文件中去修改代码,为什么选择在这个文件去修改呢?是因为这个SettingsInitialize.java文件是机器第一次开机进系统时会执行一次,以后的重启或者开机都不会执行了,就不用去添加系统属性标记位去判断是否是第一次开机进系统,具体修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| diff --git a/packages/apps/Settings/src/com/android/settings/SettingsInitialize.java b/packages/apps/Settings/src/com/android/settings/SettingsInitialize.java index e89ae0e6b90..fe188d35f72 100755 --- a/packages/apps/Settings/src/com/android/settings/SettingsInitialize.java +++ b/packages/apps/Settings/src/com/android/settings/SettingsInitialize.java @@ -47,6 +47,15 @@ import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.List; +import android.app.WallpaperManager; +import android.graphics.Bitmap; +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import android.os.Handler; +import android.content.Context; +import android.graphics.BitmapFactory; +import java.io.IOException; +
+ private Runnable mLockScreenRunnable = new Runnable() { + @Override + public void run() { + setLockScreenWallpaper(); + } + }; + + private Handler mLockScreenHandler = new Handler(); + + private void setLockScreenWallpaper() { + WallpaperManager wallpaperManager = WallpaperManager.getInstance(mContext); + int FLAG_SET_LOCK = 1 << 1; + try { + Bitmap bitmap = BitmapFactory.decodeFile("system/media/default_lock_wallpaper.png"); + ByteArrayOutputStream tmpOut = new ByteArrayOutputStream(2048); + if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, tmpOut)) { + byte[] outByteArray = tmpOut.toByteArray(); + wallpaperManager.setStream(new ByteArrayInputStream(outByteArray), null, true, FLAG_SET_LOCK); + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + }
|
总结
本方案通过系统级资源注入和首次启动配置的组合方式,有效解决了A15系统移除锁屏壁纸API的问题。其核心优势在于:
- 无需修改framework层代码
- 保持系统更新兼容性
- 实现真正的出厂预置效果
本文链接:
http://longzhiye.top/2025/08/17/2025-08-17/