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阶。实现一种方法,计算小孩有多少种上…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
