AR 眼镜之-开关机定制-实现方案
目录
📂 前言
AR 眼镜系统版本
开关机定制
1. 🔱 技术方案
1.1 技术方案概述
1.2 实现方案
1)开机 Logo
2)开机音效
3)开机动画
4)关机动画
5)关机弹窗
2. 💠 开机 Logo
2.1 使用原厂烧机工具验证
2.2 定制开机 Logo 文件
3. ⚛️ 关机弹窗
3.1 长按电源键关机时序图
3.2 关机弹窗 UI 定制
步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项
步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;
步骤三:为关机/重启使用的 SinglePressAction 增加 Hover 前后的图片替换逻辑;
3.3 定制点击关机/重启后的功能逻辑
步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑
步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog)
4. ✅ 小结
📂 前言
AR 眼镜系统版本
W517 Android9。
开关机定制
开关机定制主要包括:开机 Logo、开机音效、开机动画、关机动画、关机弹窗,下面我们主要针对如上五部分进行定制。

1. 🔱 技术方案
1.1 技术方案概述
开机 Logo 主要是 Logo 文件替换;对于开机音效、开机动画以及关机动画,主要是将相应文件内置到对应位置即可;而对于关机弹窗,是需要定制长按电源键的关机弹窗流程和UI修改的,会相对复杂一些。
1.2 实现方案
1)开机 Logo
-
先使用原厂烧机工具验证,在如下目录替换 Logo 文件和 fastboot 文件后烧机验证是否生效:ResearchDownload_R25.21.1401\Bin\ImageFiles\_DownloadFiles2EC4_1153FD4_0\;
-
将 Logo 文件放置到如下位置:vendor\sprd\release\IDH\uws6151_1h10_gofu-userdebug-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp 以及 vendor\sprd\release\IDH\uws6151_1h10_gofu-user-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp;
-
将 fastboot 使用的 Logo 文件放置到如下位置:vendor\sprd\release\IDH\uws6151_1h10_gofu-userdebug-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp(1) 以及 vendor\sprd\release\IDH\uws6151_1h10_gofu-user-native\W517_1h10_GOFU\unisoc_HWVGA_480_640.bmp(1)。
2)开机音效
-
内置 bootsound.mp3,将 bootsound.mp3 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootsound.mp3:system/media/bootsound.mp3。
由于此部分相对简单,所以后文不再单独章节介绍。
3)开机动画
-
制作 bootanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客
-
内置 bootanimation.zip,将 bootanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootanimation.zip:system/media/bootanimation.zip。
由于此部分相对简单,所以后文不再单独章节介绍。
4)关机动画
与开机动画的制作与定制基本完全一样,将 bootanimation.zip 改为 shutdownanimation.zip 即可。
-
制作 shutdownanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客
-
内置 shutdownanimation.zip,将 shutdownanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;
-
配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootanimation.zip:system/media/shutdownanimation.zip。
由于此部分相对简单,所以后文不再单独章节介绍。
5)关机弹窗
-
梳理长按电源键关机弹窗逻辑,从 PhoneWindowMananger 按键响应 power 键长按事件到 SystemUI 弹出关机界面 dialog 的流程。Android 原生的关机界面有两种,一种是 LegacyGlobalActions 中的 dialog,另一种是 SystemUI 中的 GlobalActionsDialog,常规情况下默认是弹出 SystemUI 中的关机界面,当 SystemUI 没有正常工作时才会弹出 LegacyGlobalActions 中的关机界面,本文我们分析正常情况 SystemUI 弹出的 GlobalActionsDialog;
-
关机弹窗 UI 定制,可在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项,也可在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件中调整界面 UI 等;
-
定制点击关机/重启后的功能逻辑,关机/重启时可显示厂商的定制化 UI。
2. 💠 开机 Logo
2.1 使用原厂烧机工具验证
替换 unisoc_HWVGA_480_640.bmp Logo 文件以及 unisoc_HWVGA_480_640.bmp(1) fastboot 文件烧机验证是否生效。

2.2 定制开机 Logo 文件
替换 Logo 文件和 fastboot 文件。

3. ⚛️ 关机弹窗
3.1 长按电源键关机时序图

3.2 关机弹窗 UI 定制
步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项
<string-array translatable="false" name="config_globalActionsList"><item>power</item><item>restart</item>
<!-- // Agg patch-->
<!-- // Add by agg 2024-03-07-->
<!-- <item>lockdown</item>-->
<!-- <item>logout</item>-->
<!-- <item>bugreport</item>-->
<!-- <item>screenshot</item>-->
<!-- // Agg patch end--></string-array>
只保留关机和重启选项。
步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;

步骤三:为关机/重启使用的 SinglePressAction 增加 Hover 前后的图片替换逻辑;

./frameworks/base/core/java/com/android/internal/globalactions/SinglePressAction.java:
v.setOnHoverListener((view, event) -> {if (event.getAction() == MotionEvent.ACTION_HOVER_ENTER) {view.setBackgroundResource(R.drawable.ic_power_off_restart_bg_foc);AnimationUtils.getInstance().selectItemAnimator(view);} else if (event.getAction() == MotionEvent.ACTION_HOVER_EXIT) {AnimationUtils.getInstance().unSelectItemAnimator(view);view.setBackgroundResource(R.drawable.ic_power_off_restart_bg_nor);}return false;
});
3.3 定制点击关机/重启后的功能逻辑
用户点击关机时序图如下:

步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑
private static void shutdownInner(final Context context, boolean confirm) {// ShutdownThread is called from many places, so best to verify here that the context passed// in is themed.context.assertRuntimeOverlayThemable();// ensure that only one thread is trying to power down.// any additional calls are just returnedsynchronized (sIsStartedGuard) {if (sIsStarted) {Log.d(TAG, "Request to shutdown already running, returning.");return;}}final int longPressBehavior = context.getResources().getInteger(com.android.internal.R.integer.config_longPressOnPowerBehavior);final int resourceId = mRebootSafeMode? com.android.internal.R.string.reboot_safemode_confirm/*UNISOC bug 908624,add confirm dialog.*/: (mReboot? com.android.internal.R.string.reboot_device_confirm/*UNISOC bug 908624,add confirm dialog.*/: (longPressBehavior == 2? com.android.internal.R.string.shutdown_confirm_question: com.android.internal.R.string.shutdown_confirm));Log.d(TAG, "Notifying thread to start shutdown longPressBehavior=" + longPressBehavior);// Agg patch// Add by agg 2024-05-22beginShutdownSequence(context);// Agg patch end
// if (confirm) {
// final CloseDialogReceiver closer = new CloseDialogReceiver(context);
// if (sConfirmDialog != null) {
// sConfirmDialog.dismiss();
// }
// sConfirmDialog = new AlertDialog.Builder(context)
// .setTitle(mRebootSafeMode
// ? com.android.internal.R.string.reboot_safemode_title
// /*UNISOC bug 908624*/
// :(mReboot
// ? com.android.internal.R.string.reboot_device_title
// /*UNISOC bug 908624*/
// : com.android.internal.R.string.power_off))
// .setMessage(resourceId)
// .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() {
// public void onClick(DialogInterface dialog, int which) {
// beginShutdownSequence(context);
// }
// })
// .setNegativeButton(com.android.internal.R.string.no, null)
// .create();
// closer.dialog = sConfirmDialog;
// sConfirmDialog.setOnDismissListener(closer);
// sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
// sConfirmDialog.show();
// } else {
// beginShutdownSequence(context);
// }}
步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog)
private static void beginShutdownSequence(Context context) {synchronized (sIsStartedGuard) {if (sIsStarted) {Log.d(TAG, "Shutdown sequence already running, returning.");return;}sIsStarted = true;}// SPRD:add for shutdownanimif (shutdownAnim.hasShutdownAnimation() &&!(mReason != null && mReason.startsWith(PowerManager.REBOOT_RECOVERY_UPDATE))) {shutdownAnim.playShutdownAnimation();} else {// MetaBounds patch// Add by tianbinbin 2024-07-30
// sInstance.mProgressDialog = showShutdownDialog(context);MBShutdownDialog shutdownDialog = new MBShutdownDialog(context);shutdownDialog.show();if (mReboot) {shutdownDialog.setMessage(context.getText(com.android.internal.R.string.reboot_to_reset_message));} else {shutdownDialog.setMessage(context.getText(com.android.internal.R.string.shutdown_progress));}// MetaBounds patch end}

4. ✅ 小结
对于开关机定制,本文只是一个基础实现方案,更多业务细节请参考产品逻辑去实现。
另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。
相关文章:
AR 眼镜之-开关机定制-实现方案
目录 📂 前言 AR 眼镜系统版本 开关机定制 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)开机 Logo 2)开机音效 3)开机动画 4)关机动画 5)关机弹窗 2. 💠 开机 Logo…...
论文阅读-Transformer Layers as Painters
1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务,但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响,本文设计了一系列的实验。通过实验表明,预训练语言模型中的lower和final layers与中间层分布不一致…...
【STL】vector模拟实现
vector引入 vector的实现主要依靠三个成员变量:start,finish和end_of_storage 其中: [start]指向容器中的起始位置 [finish]指向容器中最后一个有效数据的下一个位置 [end_of_storage]指向容器中现有容量的位置 通过这三个指针,就使得vector的size…...
静态成员static关键字
定义: 静态成员在C类中是一个重要的概念,它包括静态成员变量和静态成员函数。 静态成员变量 1定义:静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实 例,静态成员变量只有一份拷贝…...
本地项目git同步到线上
将本地创建的项目同步到你的 GitHub 账号线上仓库,可以按照以下步骤进行操作: 1. 在 GitHub 上创建一个新仓库 登录你的 GitHub 账号。点击右上角的加号(),然后选择 New repository。填写仓库的名称、描述等信息。选…...
Allegro如何导入DXF结构文件并生成板框(1)?
在用Allegro进行PCB设计时,需要导入DXF结构文件,由此来生成PCB的板框。 本节先讲Allegro如何导入DXF结构文件?下节讲如何利用导入的DXF结构文件生成OUTLINE板框。 Allegro如何导入DXF结构文件并生成板框(2)?-CSDN博客 详细操作方法如下: 1、选择菜单栏File 选择Import…...
Word密码忘记怎么办?三个密码找回工具帮你轻松找回密码
在工作当中,为了保护文档内容的安全,我们时常会设置密码。但有时会因为长时间未打开而忘记了密码,导致word文档无法打开。面对这种情况,我们该怎么办呢?下面小编就将给大家带来3个实用的密码找回工具,帮助大…...
使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例
使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例项目是一个很好的方式来学习如何结合高级框架进行开发。ABP 框架提供了强大的模块化和分层架构,适合构建复杂的企业级应用程序。 以下是一个使用 ABP 框架的完整示例项目,它展示了如何创建一个包含 …...
WPF图表控件库
LiveCharts: LiveCharts2预览版、内存管理不是很好,长时间持续更新的情况下,内存溢出,慎用 数据加载量不能太大(1000点左右 开始卡) 第一步:下载LiveChart NuGet包 第二步:引用&a…...
JAVA-WEB资源配置
用JAVA进行编写WEB项目时,我们一般需要对WEB进行统一配置,例如制定拦截路径、页面解析器、跨域配置、fastjson报文解析、文件上传大小配置等。 Getter Setter Configuration public class WebConfiguration extends WebMvcConfigurationSupport {priva…...
分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
时空自回归模型(STAR)及 Stata 具体操作步骤
目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 附录 数据预处理 生成时空权重矩阵 一、引言 时空自回归模型(Spatial-Temporal Autoregressive Model,简称 STAR)在分析具有时空特征的数…...
SpringCloud集成XXL-JOB定时任务
项目场景: XXL-JOB是一个分布式任务调度平台,它能够帮助开发者轻松地实现任务的定时执行、任务调度和任务管理 接入步骤 下载XXL-JOB压缩包 链接: xxl-job XXL-JOB做为子模块 将压缩包解压,项目二级新建目录xxl-job,放入目录…...
《财经网》揭秘格行销量第一的秘籍!年销百万台,获千万级网红推荐!
随身WiFi已成为当下网红爆款神器,却为何频频陷入用户信任的危机?低价诱惑背后的限速陷阱、流量虚标,市场看似繁华,实则暗藏玄机。然而,就在这片混沌与质疑交织的迷雾中,一个品牌悄然崛起,以惊人…...
Java 中 Integer 类的比较行为
在 Java 中,Integer 类的比较行为有其特定的规则,这些规则涉及到缓存和对象比较。让我们分析一下你提供的代码: java public class test2_4 { public static void main(String[] args){Integer a 100;Integer b 100;Integer c 1000;Int…...
C# 通过反射(Reflection)调用不同名泛型方法
在C#中,通过反射调用泛型方法时,如果方法的名称或参数类型有所不同,那么你需要根据具体的情况来构造合适的MethodInfo对象。由于你提到的是调用“不同名”的泛型方法,这意味着你需要首先确定具体要调用的方法名,然后再…...
Spring Boot整合Drools入门:实现订单积分规则
文章目录 项目结构Maven配置配置Drools订单实体类订单积分规则测试规则总结 在开发过程中,我们经常遇到需要根据业务规则来进行决策的场景。比如,电商平台可能需要根据订单金额为用户添加相应的积分。为了灵活地处理这些业务规则,我们可以借助…...
【C语言】文件操作函数详解
目录 C语言文件操作函数详解表格汇总1. fopen2. fclose3. fread4. fwrite5. fseek6. ftell7. rewind8. fprintf9. fscanf10. feof11. ferror12. clearerr13. 总结14. 附录:函数参考表15. 结束语相关文章: C语言文件操作函数详解 C语言提供了一组标准库函…...
Java 垃圾回收,看一遍就懂
了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程,可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放,防止内存泄漏并优化资源利用率。它就像…...
手把手教你CNVD漏洞挖掘 + 资产收集
0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖,但是一般要挖证书的话,还是需要花时间的,其中信息收集,公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
