Android客制化------7.0设置壁纸存在的一些问题
ro.wallpaper.fixsize这个节点应该是RK这边导入的,可以通过追这个节点的代码查看具体的实现方式;
最近在开7.0的坑,遇到了一些小问题,记录一下。很大可能这个问题只是我这个芯片的代码上才存在的,不过殊途同归啦。
第一个问题就是,我们增加内置可选壁纸,选择这些壁纸后进行设置,会发现拉伸很明显。通过增加打印log发现
diff --git a/src/com/android/wallpaperpicker/WallpaperCropActivity.java b/src/com/android/wallpaperpicker/WallpaperCropActivity.java
old mode 100644
new mode 100755
index bdb601b..67d1551
--- a/src/com/android/wallpaperpicker/WallpaperCropActivity.java
+++ b/src/com/android/wallpaperpicker/WallpaperCropActivity.java
@@ -337,15 +337,22 @@ public class WallpaperCropActivity extends Activity implements Handler.CallbackPoint inSize = mCropView.getSourceDimensions();Point outSize = WallpaperUtils.getDefaultWallpaperSize(getResources(),getWindowManager());
+ android.util.Log.d(LOGTAG,"inSize.x = " + inSize.x + " inSize.y = " + inSize.y
+ + " outSize.x = " + outSize.x + " outSize.y = " + outSize.y);RectF crop = Utils.getMaxCropRect(inSize.x, inSize.y, outSize.x, outSize.y, false);// Passing 0, 0 will cause launcher to revert to using the// default wallpaper sizeCropAndFinishHandler onEndCrop = new CropAndFinishHandler(new Point(0, 0),shouldFadeOutOnFinish);CropAndSetWallpaperTask cropTask = new CropAndSetWallpaperTask(streamProvider, this, crop, streamProvider.getRotationFromExif(this),outSize.x, outSize.y, onEndCrop);DialogUtils.executeCropTaskAfterPrompt(this, cropTask, getOnDialogCancelListener());}
我们的壁纸尺寸是1024*600,log打印的inSize都是正确的,但是outSize却变成了1200*1024了,由此产生了壁纸设置后有拉伸的情况。
因此问题就是出在这个Size的变化上,我们继续跟踪源码,会发现
diff --git a/src/com/android/wallpaperpicker/WallpaperUtils.java b/src/com/android/wallpaperpicker/WallpaperUtils.java
old mode 100644
new mode 100755
index 1532190..a4d88d7
--- a/src/com/android/wallpaperpicker/WallpaperUtils.java
+++ b/src/com/android/wallpaperpicker/WallpaperUtils.java
@@ -137,7 +137,7 @@ public final class WallpaperUtils {// We need to ensure that there is enough extra space in the wallpaper// for the intended parallax effects
- final int defaultWidth, defaultHeight;
+ int defaultWidth, defaultHeight;if (res.getConfiguration().smallestScreenWidthDp >= 720) {defaultWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim));defaultHeight = maxDim;
@@ -145,6 +145,11 @@ public final class WallpaperUtils {defaultWidth = Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim);defaultHeight = maxDim;}
+ android.util.Log.d("WallpaperCropActivity"," res.getConfiguration().smallestScreenWidthDp = "
+ + res.getConfiguration().smallestScreenWidthDp + " defaultWidth = " + defaultWidth
+ + " minDim =" + minDim + " maxDim =" + maxDim);
+ defaultWidth = maxDim;
+ defaultHeight = minDim;sDefaultWallpaperSize = new Point(defaultWidth, defaultHeight);}return sDefaultWallpaperSize;
问题的根源就是这个defaultWidth和defaultHeight啦。继续打印log发现maxDim和minDim就是我们正确的壁纸尺寸,这两个变量都是final的更改下修饰符,同时将最终设置的尺寸更改为正确的,辣么设置的壁纸的拉伸问题就暂时解决了。
第二个问题,就是设置sd卡中的图片作为壁纸,这个东西源码分析的过程比较复杂。可以通过dumpsys wallpaper以及dumpsys SurfaceFlinger来查看图片的设置尺寸。更改的地方涉及三处。分别是launcher3、framework/base/core以及SystemUI。
packages/apps/Launcher3
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 38545e2..ecd3ad6 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -177,7 +177,7 @@ public class InvariantDeviceProfile {(int) (largeSide * wallpaperTravelToScreenWidthRatio(largeSide, smallSide)),largeSide);} else {
- defaultWallpaperSize = new Point(Math.max(smallSide * 2, largeSide), largeSide);
+ defaultWallpaperSize = new Point(largeSide, largeSide);}}frameworks/base
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -55,6 +55,7 @@ import android.os.SystemProperties;import android.os.UserHandle;import android.text.TextUtils;import android.util.Log;
+import android.view.WindowManager;import android.view.WindowManagerGlobal;import libcore.io.IoUtils;
@@ -310,7 +311,7 @@ public class WallpaperManager {mCachedWallpaper = null;mCachedWallpaperUserId = 0;try {
- mCachedWallpaper = getCurrentWallpaperLocked(userId);
+ mCachedWallpaper = getCurrentWallpaperLocked(context,userId);mCachedWallpaperUserId = userId;} catch (OutOfMemoryError e) {Log.w(TAG, "No memory load current wallpaper", e);
@@ -342,7 +343,7 @@ public class WallpaperManager {}}- private Bitmap getCurrentWallpaperLocked(int userId) {
+ private Bitmap getCurrentWallpaperLocked(Context context,int userId) {if (mService == null) {Log.w(TAG, "WallpaperService not running");return null;
@@ -354,7 +355,15 @@ public class WallpaperManager {params, userId);if (fd != null) {try {
+ WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
+ int wW = mWindowManager.getDefaultDisplay().getWidth();
+ int wH = mWindowManager.getDefaultDisplay().getHeight();BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFileDescriptor(
+ fd.getFileDescriptor(), null, options);
+ options.inSampleSize = calculateInSampleSize(options, wW,wH);
+ options.inJustDecodeBounds = false;return BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor(), null, options);} catch (OutOfMemoryError e) {
@@ -369,11 +378,30 @@ public class WallpaperManager {return null;}+ private int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight){
+ int width = options.outWidth;
+ int height = options.outHeight;
+ int inSampleSize = 1;
+ if (width > reqWidth && height > reqHeight){
+ int widthRatio = Math.round((float) width / (float) reqWidth);
+ int heightRatio = Math.round((float) width / (float) reqWidth);
+ inSampleSize = Math.max(widthRatio, heightRatio);
+ }
+ return inSampleSize;
+ }
+private Bitmap getDefaultWallpaper(Context context, @SetWallpaperFlags int which) {
+ WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
+ int wW = mWindowManager.getDefaultDisplay().getWidth();
+ int wH = mWindowManager.getDefaultDisplay().getHeight();InputStream is = openDefaultWallpaper(context, which);if (is != null) {try {BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeStream(is, null, options);
+ options.inSampleSize = calculateInSampleSize(options, wW,wH);
+ options.inJustDecodeBounds = false;return BitmapFactory.decodeStream(is, null, options);} catch (OutOfMemoryError e) {Log.w(TAG, "Can't decode stream", e);diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index c88931d..fecc47e 100755
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -229,14 +229,15 @@ public class ImageWallpaper extends WallpaperService {surfaceHeight = Math.max(displayInfo.logicalHeight, mBackgroundHeight);}- if (FIXED_SIZED_SURFACE) {
+ //Log.d(TAG,"----surfaceWidth = "+surfaceWidth+" surfaceHeight= "+surfaceHeight);
+ /*if (FIXED_SIZED_SURFACE) {// Used a fixed size surface, because we are special. We can do// this because we know the current design of window animations doesn't// cause this to break.surfaceHolder.setFixedSize(surfaceWidth, surfaceHeight);mLastRequestedWidth = surfaceWidth;mLastRequestedHeight = surfaceHeight;
- } else {
+ } else*/ {surfaceHolder.setSizeFromLayout();}return hasWallpaper;相关文章:
Android客制化------7.0设置壁纸存在的一些问题
ro.wallpaper.fixsize这个节点应该是RK这边导入的,可以通过追这个节点的代码查看具体的实现方式; 最近在开7.0的坑,遇到了一些小问题,记录一下。很大可能这个问题只是我这个芯片的代码上才存在的,不过殊途同归啦。 第…...
VuePress2配置unocss的闭坑指南
文章目录 1. 安装依赖:准备魔法材料2. 检查依赖版本一定要一致:确保魔法配方准确无误3. 新建uno.config.js:编写咒语书4. 配置config.js和client.js:完成仪式 1. 安装依赖:准备魔法材料 在开始我们的前端魔法之前&…...
海陵HLK-TX510人脸识别模块 stm32使用
一.主函数 #include "stm32f10x.h" // Device header #include "delay.h" #include "lcd.h" #include "dht11.h" #include "IOput.h" #include "usart.h" //#include "adc.h" …...
安卓14无法安装应用解决历程
客户手机基本情况: 安卓14,对应的 targetSdkVersion 34 前天遇到了安卓14适配问题,客户发来的截图是这样的 描述:无法安装我们公司的B应用。 型号:三星google美版 解决步骤: 1、寻找其他安卓14手机测试…...
【Linux】传输层协议UDP
目录 再谈端口号 端口号范围划分 UDP协议 UDP协议端格式 UDP的特点 UDP的缓冲区 UDP注意事项 进一步深刻理解 再谈端口号 在上图中,有两个客户端A和B,客户端A打开了两个浏览器,这两个客户端都访问同一个服务器,都访问服务…...
玩机搞机基本常识-------列举安卓机型一些不常用的adb联机命令
前面分享过很多 常用的adb命令,今天分享一些不经常使用的adb指令。以作备用 1---查看当前手机所有app包名 adb shell pm list package 2--查看当前机型所有apk包安装位置 adb shell pm list package -f 3--- 清除指定应用程序数据【例如清除浏览器应用的数据】 …...
unity学习14:unity里的C#脚本的几个基本生命周期方法, 脚本次序order等
目录 1 初始的C# 脚本 1.1 初始的C# 脚本 1.2 创建时2个默认的方法 2 常用的几个生命周期方法 2.1 脚本的生命周期 2.1.1 其中FixedUpdate 方法 的时间间隔,是在这设置的 2.2 c#的基本语法别搞混 2.2.1 基本的语法 2.2.2 内置的方法名,要求更严…...
pytorch 比较两个张量的是否相等的函数介绍
在 PyTorch 中,可以使用多种函数来比较两个张量是否相等,具体选择取决于对比较精度的需求以及可能的数值误差。以下是常用的比较方法: 1. 完全相等的比较 (1) torch.eq 逐元素比较两个张量是否相等,返回布尔张量。 import torc…...
MySQL Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南
✅ Windows 11 的 MySQL 配置文件 (my.ini) 路径查找指南 在 Windows 11 上,MySQL 的 ini 配置文件(通常是 my.ini 或 my.cnf)的位置取决于 MySQL 的安装方式。下面是一些常见的路径和方法来找到这个配置文件。 🔍 方法 1&#…...
06-RabbitMQ基础
目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装 2.2.收发消息 2.2.1.交换机 2.2.2.队列 2.2.3.绑定关系 2.2.4.发送消息 2.3.数据隔离 2.3.1.用户管理 2.3.2.virtual host 3.SpringAMQP 3.1.导入Demo工程 3.2.快速入门 3.2.1.消…...
关于markdown实现页面跳转(调查测试:csdn(博客编写效果、发布效果)、typroa中md转pdf的使用情况)
一-方法介绍 [点击跳转到标题0](#1) <a href"#2">正文2</a>### <span id"2">标题0</span>二、跳转测试区 点击跳转到标题0 正文2 三、测试结果 场景MDspan-可标题写博客时候,右侧显示区效果可以发布博客的效果可以…...
el-dialog 组件 在<style lang=“scss“ scoped>标签
vue3 中使用element-plus的el-dialog 组件 <style> .el-dialog.plan-text-pdf .el-dialog__body {height: 1485px; // 需要在 style 标签写。 建议新增个类名 .plan-text-pdf 防止重复样式 } </style><style lang"scss" scoped> :deep() .el-dial…...
《深度学习梯度消失问题:原因与解决之道》
在深度学习的训练过程中,梯度消失是一个常见且棘手的问题,它会严重影响模型的训练效果和性能。以下是对该问题的原因分析与解决办法。 梯度消失问题的原因 首先是激活函数选择不当。像Sigmoid和Tanh这类传统激活函数,在输入值较大或较小时&…...
中高级运维工程师运维面试题(十一)之 Docker
目录 往期回顾前言基础知识1. 什么是 Docker?2. Docker 的核心组件有哪些?3. Docker 镜像和容器有什么区别?4. 什么是 Dockerfile? 高级知识5. 什么是多阶段构建?如何使用?6. Docker 网络有哪些模式&#x…...
Gitee图形界面上传(详细步骤)
目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe,顺序不能搞错2. …...
WebSocket 实现指南
WebSocket 实现指南 目录 1. 依赖安装 1.1 安装必要的包 # 安装 gorilla/websocket go get github.com/gorilla/websocket# 安装 gin 框架 go get github.com/gin-gonic/gin1.2 更新 go.mod require (github.com/gin-gonic/gin v1.9.1github.com/gorilla/websocket v1.5.3…...
TRELLIS - 生成 3D 作品的开源模型
TRELLIS 是一个大型 3D 资产生成模型。它接收文本或图像提示,并生成各种格式的高质量 3D 资产,例如 Radiance Fields、3D Gaussians 和网格。TRELLIS 的基石是统一的结构化 LATent (SLAT) 表示,它允许解码为不同的输出…...
uni-app图文列表到详情页面切换
需求:参考若依框架后,想实现首页浏览文章列表,没有合适的样式参考,所以需要有效果做到“图文列表到详情页面切换”,查阅了一下案例 发现有相应的案例,在导航栏“模板”中找到了 DCloud 插件市场 PC电脑端访…...
ros2-3.4话题通信最佳实践
3.4.1 工程架构设计 需求背景: 第一,通过这个小工具可以看到系统的实时状态信息包括记录信息的时间、主机名称、CPU使用率、内存使用率、内存总大小、剩余内存、网络接收数据量和网络发送数据量; 第二,要有一个简单的界面,可以将…...
Vmware安装centos
用来记录自己安装的过程 一、创建虚拟机安装centos镜像 点击完成后,等待一会会进入centos的系统初始化界面 二、centos初始化配置 三、配置网络 1、虚拟网络编辑器,开启VMnet1、VMnet8的DHCP vmware左上角工具栏,点击【编辑】->【虚拟网…...
实战指南:构建高可用集群的核心步骤与关键技术
构建高可用集群的核心步骤 高可用(High Availability, HA)集群旨在通过冗余设计和故障转移机制,确保服务在硬件或软件故障时仍能持续运行。以下是搭建高可用集群的核心步骤: 1. 需求分析与架构设计 明确目标:定义可…...
手把手教你为Windows10的ROS环境创建‘一键启动’快捷方式(含VS2022路径配置详解)
Windows高效开发:ROS环境一键启动方案深度解析 在Windows系统上搭建ROS开发环境后,每次启动都需要手动配置环境变量、加载开发工具链,这种重复性操作不仅浪费时间,还容易因输入错误导致环境异常。本文将彻底解决这一痛点ÿ…...
Obsidian Weread插件:构建个人数字阅读知识库的智能桥梁
Obsidian Weread插件:构建个人数字阅读知识库的智能桥梁 【免费下载链接】obsidian-weread-plugin Obsidian Weread Plugin is a plugin to sync Weread(微信读书) hightlights and annotations into your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirr…...
构建真正AI-ready的可观测体系(不是简单加个Prometheus):LLM服务、向量DB、微批Pipeline全链路告警设计实战
第一章:AI原生软件研发监控告警体系搭建 2026奇点智能技术大会(https://ml-summit.org) AI原生软件具备动态推理路径、模型权重漂移、Prompt变异响应、多模态输入不确定性等独特可观测性挑战,传统基于微服务的监控范式难以覆盖其全生命周期异常。构建面…...
AcousticSense AI实战应用:短视频创作者BGM流派匹配提升完播率21%
AcousticSense AI实战应用:短视频创作者BGM流派匹配提升完播率21% 1. 引言:音乐匹配如何影响短视频完播率 短视频创作者都知道一个秘密:背景音乐的选择直接影响观众是否愿意看完整个视频。一段不合适的BGM可能会让观众在几秒钟内划走&#…...
MindSpore 环境配置完全指南安
前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...
别再乱用HTTP方法了!从RESTful规范看@GetMapping和@PostMapping的最佳实践
RESTful API设计精髓:GetMapping与PostMapping的工程实践 在当今微服务架构盛行的时代,API设计质量直接影响着系统的可维护性和扩展性。许多开发者虽然熟练使用Spring框架的各类注解,却对HTTP协议背后的设计哲学缺乏深入理解。本文将带你从RE…...
Qwen2.5多轮对话断裂?长上下文管理优化部署教程
Qwen2.5多轮对话断裂?长上下文管理优化部署教程 你是不是也遇到过这样的情况:用Qwen2.5模型进行多轮对话,聊着聊着,它好像就“失忆”了,不记得前面说过什么?或者当你输入一段很长的文档让它总结时…...
linux指令的介绍(2)
此次核心介绍新的指令1.rm 删文件2.man查指令使用3.cp 拷贝文件内容4.cat 打印文件内容5.mv 剪切内容6.less 一页一页的打印文件内容7.date 查时间1.rm删文件rmdir:只能删空目录ubuntuVM-0-2-ubuntu:~/lesson3$ ll total 12 drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 2…...
理想汽车又孵化一家具身公司......
点击下方卡片,关注“自动驾驶之心”公众号戳我-> 领取自动驾驶近30个方向学习路线编辑 | 自动驾驶之心>>自动驾驶前沿信息获取→自动驾驶之心知识星球据雷峰网《新智驾》报道,理想汽车前AI首席科学家陈伟联合理想汽车前产品线总裁张骁创办的公司…...
