Android Google 开机向导定制 setup wizard
Android 开机向导定制
采用 rro_overlays 机制来定制开机向导,定制文件如下:
GmsSampleIntegrationOverlay$ tree
.
├── Android.bp
├── AndroidManifest.xml
└── res
└── raw
├── wizard_script_common_flow.xml
├── wizard_script_customize_flow.xml
└── wizard_script.xml
Android.bp
runtime_resource_overlay {name: "GmsSampleIntegrationOverlay",product_specific: true,
}
在项目对应的.mk 文件添加编译引用
PRODUCT_PACKAGES += \GmsSampleIntegrationOverlay
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
#/*
# * Copyright (C) 2023 Lens Technology (Xiangtan) Co.,Ltd, All rights reserved.
# * Author: XT900109
# */
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.xxxx.gmssampleintegrationsoverlay"android:versionCode="1"android:versionName="1.0"><application android:hasCode="false" /><overlay android:targetPackage="com.google.android.gmsintegration"android:priority="0"android:isStatic="true" />
</manifest>
rro_overlays/GmsSampleIntegrationOverlay/res/raw/wizard_script_lens_customize_flow.xml
自定义 wizard_script_customize_flow.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--The wizard:uris recorded here have the inconvenience of being generated by hand, but they allowfor the full spread of launch flags (we need FLAG_ACTIVITY_NEW_TASK [0x10000000]), where the<intent> tag processed by Intent.parseIntent() does not.adb shell am to-intent-uri -a com.android.setupwizard.WELCOME -f 0x10000000 \-\-ez firstRun true
--><WizardScript xmlns:wizard="http://schemas.android.com/apk/res/com.google.android.setupwizard"wizard:firstAction="user_terms_of_service1"><WizardAction id="user_terms_of_service1"wizard:uri="intent:#Intent;action=com.android.setupwizard.USER_TERMS_OF_SERVICE;end" ><result wizard:action="user_service_notice" /></WizardAction><WizardAction id="user_service_notice"wizard:uri="intent:#Intent;action=com.android.setupwizard.USER_SETUP_FINISH;end" ></WizardAction><!-- <WizardAction id="END_OF_SCRIPT"wizard:uri="intent:#Intent;action=com.android.setupwizard.EXIT;end" />-->
</WizardScript>
在 wizard_script_common_flow.xml 文件里面添加引用
<WizardAction id="user_terms_of_service"wizard:script="android.resource://com.xxxx.gmssampleintegrationsoverlay/raw/wizard_script_customize_flow">
</WizardAction>
注意这里的 com.xxxx.gmssampleintegrationsoverlay 需要对应上面AndroidManifest.xml package
<!-- Set screen lock options. The action must precede the payments action [RECOMMENDED, CUSTOMIZABLE] --><WizardAction id="lock_screen"wizard:uri="intent:#Intent;action=com.google.android.setupwizard.LOCK_SCREEN;end" ></WizardAction><!-- MY completion [CUSTOMIZABLE] --><WizardAction id="user_terms_of_service"wizard:script="android.resource://com.xxxx.gmssampleintegrationsoverlay/raw/wizard_script_customize_flow"></WizardAction><!-- Labeled end of script (for branching) [RECOMMENDED, CUSTOMIZABLE] --><WizardAction id="END_OF_SCRIPT" />
定义 com.android.setupwizard.USER_TERMS_OF_SERVICE
在项目的 AndroidManifest.xml
<activity android:name=".setupwizard.SetupWFinishActivity"android:exported="true" ><intent-filter><action android:name="com.android.setupwizard.USER_SETUP_FINISH" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
SetupWFinishActivity.java
package com.android.settings.setupwizard;import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;import com.android.settings.R;public class SetupWFinishActivity extends Activity {public static final String TAG = "SetupWFinishActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);getWindow().setStatusBarColor(Color.WHITE);getWindow().setNavigationBarColor(Color.WHITE);getWindow().setNavigationBarDividerColor(Color.WHITE);getActionBar().hide();setContentView(R.layout.activity_setup_wfinish);findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//: TODO onNext();}});}public void onNext() {int resultCode = Activity.RESULT_OK;Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode);Log.e(TAG, "onNext() intent:" + intent);try {startActivityForResult(intent, Activity.RESULT_OK);} catch (ActivityNotFoundException e) {Log.e(TAG, e.getMessage());}Intent returnIntent = new Intent();setResult(Activity.RESULT_OK,returnIntent);finish();}
}
WizardManagerHelper的实现
static class WizardManagerHelper {private static final String ACTION_NEXT = "com.android.wizard.NEXT";static final String EXTRA_SCRIPT_URI = "scriptUri";static final String EXTRA_ACTION_ID = "actionId";private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";public static final String EXTRA_THEME = "theme";static final String EXTRA_WIZARD_BUNDLE = "wizardBundle";static final String EXTRA_IS_FIRST_RUN = "firstRun";static final String EXTRA_IS_DEFERRED_SETUP = "deferredSetup";static final String EXTRA_IS_PRE_DEFERRED_SETUP = "preDeferredSetup";public static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow";public static Intent getNextIntent(Intent originalIntent, int resultCode) {return getNextIntent(originalIntent, resultCode, null);}public static Intent getNextIntent(Intent originalIntent, int resultCode, Intent data) {Intent intent = new Intent(ACTION_NEXT);copyWizardManagerExtras(originalIntent, intent);intent.putExtra(EXTRA_RESULT_CODE, resultCode);if (data != null && data.getExtras() != null) {intent.putExtras(data.getExtras());}intent.putExtra(EXTRA_THEME, originalIntent.getStringExtra(EXTRA_THEME));return intent;}public static void copyWizardManagerExtras(Intent srcIntent, Intent dstIntent) {dstIntent.putExtra(EXTRA_WIZARD_BUNDLE, srcIntent.getBundleExtra(EXTRA_WIZARD_BUNDLE));for (String key :Arrays.asList(EXTRA_IS_FIRST_RUN,EXTRA_IS_DEFERRED_SETUP,EXTRA_IS_PRE_DEFERRED_SETUP,EXTRA_IS_SETUP_FLOW)) {dstIntent.putExtra(key, srcIntent.getBooleanExtra(key, false));}for (String key : Arrays.asList(EXTRA_THEME, EXTRA_SCRIPT_URI, EXTRA_ACTION_ID)) {dstIntent.putExtra(key, srcIntent.getStringExtra(key));}}}
相关文章:
Android Google 开机向导定制 setup wizard
Android 开机向导定制 采用 rro_overlays 机制来定制开机向导,定制文件如下: GmsSampleIntegrationOverlay$ tree . ├── Android.bp ├── AndroidManifest.xml └── res └── raw ├── wizard_script_common_flow.xml ├── wizard_script…...

OpenEL GS之深入解析视频图像处理中怎么实现错帧同步
一、什么是错帧同步? 现在移动设备的系统相机的最高帧率在 120 FPS 左右,当帧率低于 20 FPS 时,用户可以明显感觉到相机画面卡顿和延迟。我们在做相机预览和视频流处理时,对每帧图像处理时间过长(超过 30 ms)就很容易造成画面卡顿,这个场景就需要用到错帧同步方法去提升…...
MyBatis处理LIKE查询时,如何将传值中包含下划线_和百分号%等特殊字符处理成普通字符而不是SQL的单字符通配符
MySQL中,_和%在LIKE模糊匹配中有特殊的含义: 下划线 _ 在LIKE模糊匹配中表示匹配任意单个字符。百分号 % 在LIKE模糊匹配中表示匹配任意多个字符(包括零个字符) 如果这种字符不经过处理,并且你的模糊查询sql语句书写…...
Spring MVC(三) 国际化
SpringMVC 国际化 1、添加相关依赖2、配置MessageSourceBean方式一:ReloadableResourceBundleMessageSource方式二:ResourceBundleMessageSource 3、添加消息资源文件英文 messages_en.properties中文 messages_zh_CN.properties默认 messages.propertie…...

四款坚固耐用、小尺寸、1EDB9275F、1EDS5663H、1EDN9550B、1EDN7512G单通道栅极驱动器IC
1、1EDB9275F 采用DSO-8 150mil封装的单通道隔离栅极驱动器(PG-DSO-8) EiceDRIVER™ 1EDB 产品系列 单通道栅极驱动器IC具有3 kVrms的输入输出隔离电压额定值。 栅极驱动器系列具有6/-4 ns传输延迟精度,可针对具有高系统级效率的快速开关应…...
登录页添加验证码
登录页添加验证码 引入验证码页面组件:ValidCode.vue <template><div class"ValidCodeContent" style""><divclass"ValidCode disabled-select":style"width:${width}; height:${height}"click"refre…...

03--数据库连接池
1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet、beans)中建立数据库连接进行sql操作断开数据库连接 这种模式开发,存在的问题:…...

MySQL表的基本插入查询操作详解
博学而笃志,切问而近思 文章目录 插入插入更新 替换查询全列查询指定列查询查询字段为表达式查询结果指定别名查询结果去重 WHERE 条件基本比较逻辑运算符使用LIKE进行模糊匹配使用IN进行多个值匹配 排序筛选分页结果更新数据删除数据截断表聚合函数COUNTSUMAVGMAXM…...

『 C++ 』红黑树RBTree详解 ( 万字 )
文章目录 🦖 红黑树概念🦖 红黑树节点的定义🦖 红黑树的插入🦖 数据插入后的调整🦕 情况一:ucnle存在且为红🦕 情况二:uncle不存在或uncle存在且为黑🦕 插入函数代码段(参考)🦕 旋转…...
c# 人脸识别的思路
在C#中实现人脸识别,您可以使用诸如虹软ArcFace等第三方人脸识别SDK。以下是一个基于虹软ArcFace SDK的C#人脸识别示例的大致步骤: 安装与引用SDK: 首先,您需要从虹软官网下载适用于C#的ArcFace人脸识别SDK,并将其安装…...

如何用AI提高论文阅读效率?
已经2024年了,该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴,一定深有体验——费劲。其他agents也没有能搞定的,今天我发现了一个超级厉害的写论文解读的agent ,…...

文件重命名方法:不同路径的文件名大小写如何批量转换技巧
在文件管理中,经常要处理文件重命名的问题,尤其是涉及到不同路径下的文件名大小写转换时。下面来看云炫文件管理器如何批量转换文件名的大小写的技巧,轻松完成这项任务。 准备多个不同路径文件夹,在里面各放几个文件。接下来开始…...
深度学习中的最优化算法是什么?
在深度学习中,最优化算法主要用于调整神经网络的参数(如权重和偏差),以最小化或最大化某个目标函数(通常是损失函数)。这些算法对于训练高效、准确的深度学习模型至关重要。以下是几种在深度学习中常用的最…...
SQL执行时间过长如何优化
这个问题,其实跟慢 SQl 排查解决有点像。可以从以下这几个方面入手: 确定瓶颈 首先查看 MySQL 日志、慢查询日志、explain 分析 SQL 的执行计划、profile 分析执行耗时、Optimizer Trace分析详情等操作,确定查询执行的瓶颈在哪里。只有确定…...
局部阈值 local_threshold
Currently the operator offers only the Method adapted_std_deviation. This algorithm is a text binarization technique and provides good results for document images. 目前这个算子只提供adapted_std_deviation方法,这个算子是一个文本二值化技术…...
【C/C++】C语言的高级编程(内存分区,指针)
C语言的高级编程【内存,指针】 基本知识变量gcc size工具 内存分区指针相关定义和赋值指针加法函数指针多级指针数组指针传参 基本知识 变量 变量解释全局变量出现在代码块{}之外的变量就是全局变量局部变量一般情况下,代码块{}内部定义的变量就是自动…...

Python ❀ 使用代码实现API接口调用详解
文章目录 1. 工具准备1.1. requests代码包1.2. BurpSuite抓包工具 2. 操作过程2.1. 一个简单的请求2.1.1. Burp获取响应2.1.2. 转发获取响应 2.2. 构造GET类型URL参数2.3. 构造请求头部2.4. 构造POST类型payload数据2.4.1. urlencoded格式2.4.2. json格式 本文主要讲解常用API接…...

关于KT6368A双模蓝牙芯片的BLE在ios的lightblue大数量数据测试
测试简介 关于KT6368A双模蓝牙芯片的BLE在ios的lightblue app大数量数据测试 测试环境:iphone7 。KT6368A双模程序96B6 App:lightblue ios端 可以打开log日志查看通讯流程 测试数据:长度是1224个字节,单次直接发给KT6368A&a…...

云边协同的 RTC 如何助力即构全球实时互动业务实践
作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…...

使用python连接elasticsearch
有一个困惑了好久的问题,那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭,也就是下面的内容,这个要进入到es的docker中去改config/elasticsearch.yml配置文件,但是这样改了以后kib…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...