Android 13 GMS 内置壁纸

如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面
扩展下,默认壁纸在
frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
添加默认壁纸,追溯下代码。
1.ThemePicker
当前页面是 com.android.wallpaper/.picker.CustomizationPickerActivity ,对应源码 packages/apps/ThemePicker 。
但是在此目录下找不到 CustomizationPickerActivity 。
查看 packages/apps/ThemePicker/Android.bp ,
java_defaults {name: "ThemePicker_defaults",static_libs: ["guava","monet","renderscript_toolkit","wallpaper-common-deps","SettingsLibSettingsTheme","SystemUI-statsd","styleprotoslite","androidx.lifecycle_lifecycle-livedata-ktx","androidx.lifecycle_lifecycle-runtime-ktx","androidx.lifecycle_lifecycle-viewmodel-ktx","androidx.recyclerview_recyclerview","SystemUICustomizationLib",],jni_libs: ["librenderscript-toolkit",],srcs: [":WallpaperPicker2_srcs",":ThemePicker_srcs",":ThemePicker_src_overrides",],use_embedded_native_libs: true,resource_zips: [":WallpaperPicker2_res", ":ThemePicker_res", ":ThemePicker_res_overrides"],optimize: {enabled: false,},kotlincflags: ["-Xjvm-default=enable"],certificate: "",privileged: true,system_ext_specific: true,
}//
// Build app code.
//
android_app {name: "ThemePicker",defaults: ["ThemePicker_defaults"],platform_apis: true,manifest: "AndroidManifest.xml",additional_manifests: [":WallpaperPicker2_Manifest"],overrides: ["WallpaperPicker2"],
}
ThemePicker 引用了 WallpaperPicker2,在 WallpaperPicker2 里找到了 CustomizationPickerActivity 。
2.WallpaperPicker2
找到 DefaultCategoryProvider.java ,
/*** AsyncTask subclass used for fetching all the categories and pushing them one at a time to* the receiver.*/protected static class FetchCategoriesTask extends AsyncTask<Void, Category, Void> {private CategoryReceiver mReceiver;private PartnerProvider mPartnerProvider;protected final Context mAppContext;public FetchCategoriesTask(CategoryReceiver receiver, Context context) {mReceiver = receiver;mAppContext = context.getApplicationContext();}@Overrideprotected Void doInBackground(Void... voids) {mPartnerProvider = InjectorProvider.getInjector().getPartnerProvider(mAppContext);// "My photos" wallpapersandroid.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,My photos wallpapers");publishProgress(getMyPhotosCategory());android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,publishDeviceCategories");publishDeviceCategories();// Legacy On-device wallpapers. Only show if on mobile.android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,getOnDeviceCategory");publishProgress(getOnDeviceCategory());// Live wallpapers -- if the device supports them.if (mAppContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LIVE_WALLPAPER)) { List<WallpaperInfo> liveWallpapers = LiveWallpaperInfo.getAll(mAppContext, getExcludedLiveWallpaperPackageNames());android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,liveWallpapers.size():"+liveWallpapers.size());if (liveWallpapers.size() > 0) {publishProgress(new ThirdPartyLiveWallpaperCategory(mAppContext.getString(R.string.live_wallpapers_category_title),mAppContext.getString(R.string.live_wallpaper_collection_id),liveWallpapers,PRIORITY_LIVE,getExcludedLiveWallpaperPackageNames()));}}// Third party apps.android.util.Log.d("luoah", "[DefaultCategoryProvider] doInBackground ,Third party apps");List<ThirdPartyAppCategory> thirdPartyApps = ThirdPartyAppCategory.getAll(mAppContext, PRIORITY_THIRD_PARTY, getExcludedThirdPartyPackageNames());for (ThirdPartyAppCategory thirdPartyApp : thirdPartyApps) {publishProgress(thirdPartyApp);}return null;}
2.1 图库上的壁纸
2.2 设备上的壁纸
packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultCategoryProvider.java
getOnDeviceCategory 方法,
/*** Returns a category which incorporates both GEL and bundled wallpapers.*/protected Category getOnDeviceCategory() {android.util.Log.d("luoah", "[DefaultCategoryProvider] getOnDeviceCategory");try {throw new Exception("luoah_getOnDeviceCategory");} catch (Exception e) {e.printStackTrace();}List<WallpaperInfo> onDeviceWallpapers = new ArrayList<>();if (!mPartnerProvider.shouldHideDefaultWallpaper()) {DefaultWallpaperInfo defaultWallpaperInfo = new DefaultWallpaperInfo();onDeviceWallpapers.add(defaultWallpaperInfo);}List<WallpaperInfo> partnerWallpaperInfos = PartnerWallpaperInfo.getAll(mAppContext);onDeviceWallpapers.addAll(partnerWallpaperInfos);List<WallpaperInfo> legacyPartnerWallpaperInfos = LegacyPartnerWallpaperInfo.getAll(mAppContext);onDeviceWallpapers.addAll(legacyPartnerWallpaperInfos);List<WallpaperInfo> privateWallpapers = getPrivateDeviceWallpapers();if (privateWallpapers != null) {onDeviceWallpapers.addAll(privateWallpapers);}return onDeviceWallpapers.isEmpty() ? null : new WallpaperCategory(mAppContext.getString(R.string.on_device_wallpapers_category_title),mAppContext.getString(R.string.on_device_wallpaper_collection_id),onDeviceWallpapers,PRIORITY_ON_DEVICE);}
packages/apps/WallpaperPicker2/src/com/android/wallpaper/model/PartnerWallpaperInfo.java ,
/*** @param ctx* @return All partner wallpapers found on the device.*/public static List<WallpaperInfo> getAll(Context ctx) {PartnerProvider partnerProvider = InjectorProvider.getInjector().getPartnerProvider(ctx);List<WallpaperInfo> wallpaperInfos = new ArrayList<>();final Resources partnerRes = partnerProvider.getResources();final String packageName = partnerProvider.getPackageName();if (partnerRes == null) {return wallpaperInfos;}final int resId = partnerRes.getIdentifier(PartnerProvider.LEGACY_WALLPAPER_RES_ID, "array",packageName);android.util.Log.d("luoah", "[PartnerWallpaperInfo] getAll , packageName:"+packageName+" , resId:"+resId);// Certain partner configurations don't have wallpapers provided, so need to check; return// early if they are missing.if (resId == 0) {return wallpaperInfos;}final String[] extras = partnerRes.getStringArray(resId);for (String extra : extras) {int wpResId = partnerRes.getIdentifier(extra, "drawable", packageName);android.util.Log.d("luoah", "[PartnerWallpaperInfo] getAll , wpResId:"+wpResId);if (wpResId != 0) {final int thumbRes = partnerRes.getIdentifier(extra + "_small", "drawable", packageName);if (thumbRes != 0) {final int fullRes = partnerRes.getIdentifier(extra, "drawable", packageName);android.util.Log.d("luoah", "[PartnerWallpaperInfo] extras in , thumbRes:"+thumbRes);WallpaperInfo wallpaperInfo = new PartnerWallpaperInfo(thumbRes, fullRes);wallpaperInfos.add(wallpaperInfo);}} else {Log.e("PartnerWallpaperInfo", "Couldn't find wallpaper " + extra);}}return wallpaperInfos;}
加打印,机器上 packageName 是 com.google.android.gmsintegration , 即 vendor/partner_gms/apps/GmsSampleIntegration 。
结合源码分析,在 GmsSampleIntegration 应用里加一组数组,数组元素是壁纸图片名称,
- 添加
res/values/arrays.xml
<resources><string-array name="partner_wallpapers" translatable="false"><item>wallpaper_01</item><item>wallpaper_02</item><item>wallpaper_03</item><item>wallpaper_04</item><item>wallpaper_05</item><item>wallpaper_06</item>
</string-array>
- 在
res_dhs_full/drawable/目录放入壁纸,同时存放 *_small.jpg ,
wallpaper_01.jpg
wallpaper_01_small.jpg
wallpaper_02.jpg
wallpaper_02_small.jpg
wallpaper_03.jpg
wallpaper_03_small.jpg
wallpaper_04.jpg
wallpaper_04_small.jpg
wallpaper_05.jpg
wallpaper_05_small.jpg
wallpaper_06.jpg
wallpaper_06_small.jpg
替换后的效果,点击进去显示选择图片,选择图片后是预览页面,

2.3 动态壁纸
2.4 三方应用的壁纸
相关文章:
Android 13 GMS 内置壁纸
如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面 扩展下,默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...
【LeetCode】234. 回文链表
回文链表 题目描述: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#…...
零基础学会机器学习,到底要多久?
这两天啊,有不少朋友和我说,想学机器学习,但是之前没有基础,不知道能不能学得会。 首先说结论,只要坚持,就能学会,但是一定不能三天打鱼两天晒网,要持之以恒,至少每隔两…...
视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?
安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台,支持多种视频格式和编码方式(H.264/H.265),能够轻松对接各类前端监控设备,实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...
Qt解析XML
背景 本来想解析VS的项目配置文件(*.vcxproj),配合cppclean来发现多余的#incldue。 结果发现低估了难度,VS会间接引入许多目录。 略有不甘,暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...
PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解
Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码,我们试试暴力破解 image-20240807122743025 开始爆破了,全部失败,哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...
OpenCV—二值化Threshold()、adaptiveThreshold()
cv2.threshold() c:double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注:源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src:源图片…...
第二天:java面向对象编程(OOP)
第二天:java面向对象编程(OOP) 1. 深入理解OOP四大特性 封装(Encapsulation):学习如何将数据(属性)和操作数据的方法(行为)组合成一个独立的单元࿰…...
Selenium + Python 自动化测试07(滑块的操作方法)
我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证,selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…...
三防平板满足多样化定制为工业领域打造硬件解决方案
在当今工业领域,数字化、智能化的发展趋势日益显著,对于高效、可靠且适应各种复杂环境的硬件设备需求不断增长。三防平板作为一种具有坚固耐用、防水防尘防摔特性的工业级设备,正以其出色的性能和多样化的定制能力,为不同行业的应…...
pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)
目录 LeNet-5 LeNet-5 结构 CIFAR-10 pytorch实现 lenet模型 训练模型 1.导入数据 2.训练模型 3.测试模型 测试单张图片 代码 运行结果 LeNet-5 LeNet-5 是由 Yann LeCun 等人在 1998 年提出的一种经典卷积神经网络(CNN)模型,主要…...
Word卡顿的处理方法
1. 检查和关闭后台程序 关闭不必要的后台程序,释放系统资源。使用任务管理器(Ctrl + Shift + Esc)查看占用CPU和内存较高的应用,并关闭它们。2. 更新Microsoft Office 确保你的Microsoft Office软件是最新版本。新版本通常修复了已知的性能问题。打开Word,点击文件 > 账…...
在 Linux上常见的10大压缩格式解压命令和它们对应的压缩格式
文章目录 前言一、解压 .zip 文件二、解压 .tar.gz 或 .tgz 文件三、解压 .tar 文件四、解压 .tar.bz2 文件五、解压 .tar.xz 文件六、解压 .gz 文件七、解压 .bz2 文件八、解压 .xz 文件九、解压 .7z 文件十、解压 .rar 文件总结 前言 Linux 命令可以解压不同格式的压缩文件。…...
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
文章目录 2.链队列2.1初始化(带头结点)不带头结点 2.2入队(带头结点)2.3出队(带头结点)❗2.4链队列c实例 3.双端队列考点:输出序列合法性栈双端队列 队列的应用1.树的层次遍历2.图的广度优先遍历3.操作系统…...
技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定
作者:Rachel Kang 排版:Alan Wang 在当今的应用开发领域,通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件,甚至允许无缝创建跨平台自定义控件。然而&a…...
Linux笔记 --- 标准IO
系统IO的最大特点一个是更具通用性,不管是普通文件、管道文件、设备节点文件、接字文件等等都可以使用,另一个是他的简约性,对文件内数据的读写在任何情况下都是带任何格式的,而且数据的读写也都没有经过任何缓冲处理,…...
洛谷:B3625 迷宫寻路
迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置,问能否…...
【C#】explicit、implicit与operator
字面解释 explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。 implicit:含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。 operator:操作人员;技工;电话员;接线员;…...
Vue:Vuex-Store使用指南
一、简介 1.1Vuex 是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window)…...
对经典动态规划问题【爬台阶】的一些思考
背景 今天在做Leetcode题目时,做到了一道经典的动态规划问题:爬楼梯,题目的大致意思很简单,有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
