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

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

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

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


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java语言中的websocket
  • 通过AI帮我分析实现的2019销售季度对比叠加图
  • nc的多种使用场景和各种反向shell方法
  • 【MySQL】什么是事务?在高并发场景使用事务会出现什么问题,该如何解决
  • 数据结构与算法 - 图
  • EFCore中结合Dapper执行SQL任意查询
  • 初识C++:开启C++之旅
  • Angular组件概念
  • 基于 Android studio 实现停车场管理系统--原创
  • Java String 去掉特殊字符之前的内容方法
  • 实训日记day29
  • 主成分分析(PCA)
  • 自然语言处理(NLP)--数据增强
  • 文本纠错实现定位与标记
  • JMeter进阶技巧:参数化与数据驱动测试
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular6错误 Service: No provider for Renderer2
  • Brief introduction of how to 'Call, Apply and Bind'
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6系列(二)变量的解构赋值
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java小心机(3)| 浅析finalize()
  • JS数组方法汇总
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python实现BT种子转化为磁力链接【实战】
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • text-decoration与color属性
  • vue学习系列(二)vue-cli
  • Webpack 4 学习01(基础配置)
  • 回顾2016
  • 解析带emoji和链接的聊天系统消息
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 删除表内多余的重复数据
  • 写给高年级小学生看的《Bash 指南》
  • 智能网联汽车信息安全
  • 数据可视化之下发图实践
  • # Apache SeaTunnel 究竟是什么?
  • # windows 安装 mysql 显示 no packages found 解决方法
  • ### RabbitMQ五种工作模式:
  • #预处理和函数的对比以及条件编译
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (面试必看!)锁策略
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十一)手动添加用户和文件的特殊权限
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)大道至简,职场上做人做事做管理
  • (转载)Google Chrome调试JS
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET CF命令行调试器MDbg入门(一)
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本