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 文件和 fastboot 文件后烧机验证是否生效:ResearchDownload_R25.21.1401\Bin\ImageFiles\_DownloadFiles2EC4_1153FD4_0\;

  2. 将 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;

  3. 将 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)开机音效
  1. 内置 bootsound.mp3,将 bootsound.mp3 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;

  2. 配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootsound.mp3:system/media/bootsound.mp3。

        由于此部分相对简单,所以后文不再单独章节介绍。

3)开机动画
  1. 制作 bootanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客

  2. 内置 bootanimation.zip,将 bootanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;

  3. 配置烧机时将文件内置到整机,在 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 即可。

  1. 制作 shutdownanimation.zip,本人在此文章有详细介绍,这里就不再赘述了:Android 自定义开机动画_rk3568更换开机动画-CSDN博客

  2. 内置 shutdownanimation.zip,将 shutdownanimation.zip 文件放在如下路径:device\sprd\sharkl5\uws6151_1h10_go\;

  3. 配置烧机时将文件内置到整机,在 device\sprd\sharkl5\uws6151_1h10_go\uws6151_1h10_gofu.mk 文件中增加如下内容:PRODUCT_COPY_FILES += $(BOARDDIR)/bootanimation.zip:system/media/shutdownanimation.zip。

        由于此部分相对简单,所以后文不再单独章节介绍。

5)关机弹窗
  1. 梳理长按电源键关机弹窗逻辑,从 PhoneWindowMananger 按键响应 power 键长按事件到 SystemUI 弹出关机界面 dialog 的流程。Android 原生的关机界面有两种,一种是 LegacyGlobalActions 中的 dialog,另一种是 SystemUI 中的 GlobalActionsDialog,常规情况下默认是弹出 SystemUI 中的关机界面,当 SystemUI 没有正常工作时才会弹出 LegacyGlobalActions 中的关机界面,本文我们分析正常情况 SystemUI 弹出的 GlobalActionsDialog;

  2. 关机弹窗 UI 定制,可在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项,也可在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件中调整界面 UI 等;

  3. 定制点击关机/重启后的功能逻辑,关机/重启时可显示厂商的定制化 UI。

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. ✅ 小结

        对于开关机定制,本文只是一个基础实现方案,更多业务细节请参考产品逻辑去实现。

        另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402993.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础——注释

在开发中注释是必不可少的&#xff0c;帮助我们更好的标记阅读代码&#xff0c;下面介绍几种常用的注释方式。 一、注释种类 1. 单行注释 使用//一行代码来进行注释&#xff0c;只能注释一行内容 2. 多行注释 使用斜杠星号的方式 /*注释多行代码*/&#xff0c;注释多行代…

ECharts 数据可视化 入门基本知识 下载安装常用的图表 【1】

ECharts一个基于 JavaScript 的开源可视化图表库&#xff0c;即将数据以图形或图像的方式展现成在屏幕上显示出来&#xff0c;这种方式称为数据可视化。数据可视化有助于我们分析数据&#xff0c;帮助我们更深入更直观的理解数据。今天回顾顺便总结一下echarts的基本知识&#…

C++密码管理器

先问一句 最近有几个关注我的原力等级为0或-1&#xff0c;文章全是转载&#xff0c;转载时间基本都在2021年&#xff0c;而且关注了很多人&#xff0c;这些是僵尸粉吗&#xff1f; 文末有投票&#xff0c;麻烦参与一下谢谢 实现功能列表 暂时还没做加密功能 打算用openssl/a…

HTTPS通讯全过程

HTTPS通讯全过程 不得不说&#xff0c;https比http通讯更加复杂惹。在第一次接触https代码的时候&#xff0c;不知道为什么要用用证书&#xff0c;公钥是什么&#xff1f;私钥是什么&#xff1f;他们作用是什么&#xff1f;非对称加密和对称加密是啥&#xff1f;天&#xff0c;…

可视化大屏入口界面,炫酷科技又不失简洁时尚。

可视化大屏界面&#xff0c;大家见到很多了&#xff0c;当可视化大屏是多个系统的融合&#xff0c;而且彼此又相互独立&#xff0c;就需要设计一个入口页面&#xff0c;便于分流客户&#xff0c;这次我给大家分享一批。 设计可视化大屏入口界面时&#xff0c;可以结合炫酷科技…

startData

某音startData 记得加入学习群&#xff1a; python爬虫&js逆向3 714283180

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

记录Java使用websocket

实现场景&#xff1a;每在小程序中添加一条数据时&#xff0c;后台将主动推送一个标记给PC端&#xff0c;PC端接收到标记将进行自动播放音频。 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…

游戏管理系统

目录 Java程序设计课程设计 游戏管理系统 1系统简介 1.1需求分析 1.2 编程环境与工具 2系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 3主要业务流程 &#xff08;1&#xff09;用户及管理员登录流程图 &#xff08;2&#xff09;信息添加流程 &#x…

即插即用的3D神经元注意算法

在快速发展的人工智能领域&#xff0c;科技的进步往往源于对复杂问题的突破性解决方案。如今&#xff0c;我们正站在一种激动人心的技术创新的前沿——即插即用的3D神经元注意算法。这一前沿技术不仅为计算神经科学提供了全新的视角&#xff0c;也为人工智能的未来打开了新的大…

Python教程(十四):Requests模块详解

目录 专栏列表前言&#xff1a;安装 Requests查看包安装情况&#xff1a; RESTful 介绍RESTful API设计原则示例 基本用法1. 查询ID为1的用户&#xff08;GET&#xff09;2. 创建新用户&#xff08;POST&#xff09;3. 更新ID 为 1 的用户&#xff08;PUT&#xff09;4. 删除ID…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器三. 整合SpringCloud1. 基础配置…

计算函数(c语言)

1.描述 //小乐乐学会了自定义函数&#xff0c;BoBo老师给他出了个问题&#xff0c;根据以下公式计算m的值。 // //其中 max3函数为计算三个数的最大值&#xff0c;如&#xff1a; max3(1, 2, 3) 返回结果为3。 //输入描述&#xff1a; //一行&#xff0c;输入三个整数&#xff…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…

超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩

极致精美的数字艺术杰作&#xff1a;8K壁纸级别的官方插画&#xff0c;展现超高清细节与和谐统一的美感&#xff0c;女孩的精致面容与眼神在光影下熠熠生辉&#xff0c;汉服主题下的超高分辨率作品&#xff0c;文件巨大&#xff0c;细节丰富&#xff0c;令人惊叹。 正向提示词…

Android gradle 构建

Understanding Tasks - Gradle task kapt 是 Kotlin 语言的注解处理器&#xff0c;它是 Android Studio 中用于处理 Kotlin 注解的工具。它通过在编译期间生成代码来增强 Kotlin 代码的功能。需要 Kotlin 编译器来解析和处理注解&#xff1b;使用 APT 来生成代码&#xff0c…

【初阶数据结构】链表(附题)

目录 一、顺序表的问题及思考 二、单链表 2.1链表的概念及结构 2.2.单链表的实现 2.2.1.节点的定义 2.2.2.链表的打印 2.2.3.头部插入删除/尾部插入删除 a.创建节点 b.尾插 c.头插 d.尾删 e.头删 2.2.4.查找数据 2.2.5.在指定位置之前插入数据 2.2.6删除pos节点 …

每日OJ_牛客_DP3跳台阶扩展问题

目录 DP3跳台阶扩展问题 题解代码1&#xff08;dp&#xff09; 题解代码2&#xff08;找规律&#xff09; DP3跳台阶扩展问题 跳台阶扩展问题_牛客题霸_牛客网 题解代码1&#xff08;dp&#xff09; 假定第一次跳的是一阶&#xff0c;那么剩下的是n-1个台阶&#xff0c;跳法…

矩阵中的最大得分(Lc3148)——动态规划

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。 你可以从 任一 单元格开始&#xff0c;并且必须…