当前位置: 首页 > news >正文

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 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...

【LeetCode】234. 回文链表

回文链表 题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#…...

零基础学会机器学习,到底要多久?

这两天啊&#xff0c;有不少朋友和我说&#xff0c;想学机器学习&#xff0c;但是之前没有基础&#xff0c;不知道能不能学得会。 首先说结论&#xff0c;只要坚持&#xff0c;就能学会&#xff0c;但是一定不能三天打鱼两天晒网&#xff0c;要持之以恒&#xff0c;至少每隔两…...

视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?

安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台&#xff0c;支持多种视频格式和编码方式&#xff08;H.264/H.265&#xff09;&#xff0c;能够轻松对接各类前端监控设备&#xff0c;实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...

Qt解析XML

背景 本来想解析VS的项目配置文件(*.vcxproj)&#xff0c;配合cppclean来发现多余的#incldue。 结果发现低估了难度&#xff0c;VS会间接引入许多目录。 略有不甘&#xff0c;暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...

PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解

Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码&#xff0c;我们试试暴力破解 image-20240807122743025 开始爆破了&#xff0c;全部失败&#xff0c;哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...

OpenCV—二值化Threshold()、adaptiveThreshold()

cv2.threshold() c&#xff1a;double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注&#xff1a;源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src&#xff1a;源图片…...

第二天:java面向对象编程(OOP)

第二天&#xff1a;java面向对象编程&#xff08;OOP&#xff09; 1. 深入理解OOP四大特性 封装&#xff08;Encapsulation&#xff09;&#xff1a;学习如何将数据&#xff08;属性&#xff09;和操作数据的方法&#xff08;行为&#xff09;组合成一个独立的单元&#xff0…...

Selenium + Python 自动化测试07(滑块的操作方法)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证&#xff0c;selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…...

三防平板满足多样化定制为工业领域打造硬件解决方案

在当今工业领域&#xff0c;数字化、智能化的发展趋势日益显著&#xff0c;对于高效、可靠且适应各种复杂环境的硬件设备需求不断增长。三防平板作为一种具有坚固耐用、防水防尘防摔特性的工业级设备&#xff0c;正以其出色的性能和多样化的定制能力&#xff0c;为不同行业的应…...

pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)

目录 LeNet-5 LeNet-5 结构 CIFAR-10 pytorch实现 lenet模型 训练模型 1.导入数据 2.训练模型 3.测试模型 测试单张图片 代码 运行结果 LeNet-5 LeNet-5 是由 Yann LeCun 等人在 1998 年提出的一种经典卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;主要…...

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初始化&#xff08;带头结点&#xff09;不带头结点 2.2入队&#xff08;带头结点&#xff09;2.3出队&#xff08;带头结点&#xff09;❗2.4链队列c实例 3.双端队列考点:输出序列合法性栈双端队列 队列的应用1.树的层次遍历2.图的广度优先遍历3.操作系统…...

技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 在当今的应用开发领域&#xff0c;通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件&#xff0c;甚至允许无缝创建跨平台自定义控件。然而&a…...

Linux笔记 --- 标准IO

系统IO的最大特点一个是更具通用性&#xff0c;不管是普通文件、管道文件、设备节点文件、接字文件等等都可以使用&#xff0c;另一个是他的简约性&#xff0c;对文件内数据的读写在任何情况下都是带任何格式的&#xff0c;而且数据的读写也都没有经过任何缓冲处理&#xff0c;…...

洛谷:B3625 迷宫寻路

迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵&#xff0c;每个位置要么是空地&#xff0c;要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置&#xff0c;问能否…...

【C#】explicit、implicit与operator

字面解释 explicit&#xff1a;清楚明白的;易于理解的;(说话)清晰的&#xff0c;明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。 implicit&#xff1a;含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。 operator&#xff1a;操作人员;技工;电话员;接线员;…...

Vue:Vuex-Store使用指南

一、简介 1.1Vuex 是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window)&#xf…...

对经典动态规划问题【爬台阶】的一些思考

背景 今天在做Leetcode题目时&#xff0c;做到了一道经典的动态规划问题&#xff1a;爬楼梯&#xff0c;题目的大致意思很简单&#xff0c;有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...