AR 眼镜之-开关机定制-实现方案

目录

[📂 前言](#📂 前言)

[AR 眼镜系统版本](#AR 眼镜系统版本)

开关机定制

[1. 🔱 技术方案](#1. 🔱 技术方案)

[1.1 技术方案概述](#1.1 技术方案概述)

[1.2 实现方案](#1.2 实现方案)

[1)开机 Logo](#1)开机 Logo)

2)开机音效

3)开机动画

4)关机动画

5)关机弹窗

[2. 💠 开机 Logo](#2. 💠 开机 Logo)

[2.1 使用原厂烧机工具验证](#2.1 使用原厂烧机工具验证)

[2.2 定制开机 Logo 文件](#2.2 定制开机 Logo 文件)

[3. ⚛️ 关机弹窗](#3. ⚛️ 关机弹窗)

[3.1 长按电源键关机时序图](#3.1 长按电源键关机时序图)

[3.2 关机弹窗 UI 定制](#3.2 关机弹窗 UI 定制)

[步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项](#步骤一:在 ./frameworks/base/core/res/res/values/config.xml 文件中增删弹窗内选项)

[步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;](#步骤二:在 ./frameworks/base/core/res/res/layout/global_actions_item.xml 文件调整界面 UI;)

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

[3.3 定制点击关机/重启后的功能逻辑](#3.3 定制点击关机/重启后的功能逻辑)

[步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑](#步骤一:在 ShutdownThread 文件的 shutdownInner 方法中定制关机逻辑)

[步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog)](#步骤二:在 ShutdownThread 文件的 beginShutdownSequence 方法中定制关机过程的 UI(AggShutdownDialog))

[4. ✅ 小结](#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 文件烧机验证是否生效。

替换 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 returned
        synchronized (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-22
        beginShutdownSequence(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 shutdownanim
        if (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. ✅ 小结

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

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


相关推荐
Swuagg5 天前
数字经济下的 AR 眼镜
ar·ar眼镜·数字经济
虹科数字化与AR10 天前
安宝特分享 | AR技术助力医院总院与分院间的远程面诊
ar·ar眼镜·远程医疗·ar医疗
市象25 天前
AR商业化的“AI转身”
ar·ar眼镜·rokid
深圳智物通讯1 个月前
AR智能眼镜|AR眼镜定制开发|工业AR眼镜方案
ar·ar眼镜·ai智能眼镜
虹科数字化与AR1 个月前
安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!
ar·ar眼镜·远程协助
虹科数字化与AR1 个月前
安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作
ar·ar眼镜·ar医疗·工业ar
Swuagg2 个月前
一周内从0到1开发一款 AR眼镜 相机应用?
视频播放·ar眼镜·camerax
虹科数字化与AR2 个月前
安宝特案例 | AR技术在院外心脏骤停急救中的革命性应用
ar·ar眼镜·ar医疗·急诊
虹科数字化与AR2 个月前
安宝特分享 | AR技术引领:跨国工业远程协作创新模式
ar·智能制造·ar眼镜·远程协作
虹科数字化与AR2 个月前
安宝特案例 | Fundació Puigvert 医院应用AR技术开创尿石症治疗新纪元
ar·手术·ar眼镜·远程医疗·ar医疗