- 博客(33)
- 收藏
- 关注

原创 人脸解锁从底层到上层(一)
前言本系列将探索 Android 原生人脸解锁,从底层介绍到上层,涉及底层硬件、驱动、系统服务、框架、应用、跨进程通信、接口定义语言等知识。欢迎和我一起探讨,指出我的错误或不足,完善该系列,帮助更多有需要的人。人脸解锁概述人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的...
2019-12-29 00:41:22
1360
3

原创 循环检测 Cycle Detection
定义域是{0,1,…,n},映射到值域{1,2,…,n},必定存在至少一个值最少被映射两次。 x到y的映射,把x和y当作两个节点,映射当作x的next指针,可以构成类似于链表的数据结构,你会发现必定存在循环。 循环检测Cycle Detection可以找到循环开始的节点(地方)。Floyd’s Tortoise and HareBrent’s algorithm...
2018-07-26 17:57:45
2041

原创 大O复杂度分析 Big-Oh notation
Big-Oh测量执行时间和内存如何随输入大小增加而增长的方式。优点大O给你与问题大小有关的趋势大O分析能hold得住即使计算机快十倍常见的增长率O(1):常数时间O(n):线性时间O(log n):对数时间,在常数时间和线性时间之间O(2n2n2^n):指数时间,非常糟糕的...
2018-07-20 17:06:15
5118

原创 Java HashMap 的指定初始值大小和自动扩容
HashMap指定初始值大小指定初始值大小应为2的幂。如果指定的初始值不是2的幂,则HashMap的容量为大于指定初始值的2的幂;如果不指定,容量默认为16。HashMap自动扩容当HashMap的键值对个数大于容量的75%时,HashMap的容量扩大一倍。...
2018-07-17 11:38:41
11361
原创 人脸解锁从底层到上层(二)
前言这一部分简单讲讲底层的实现。Face HIDL为了实现 Face HIDL,必须在供应商 (vendor) 指定的库 (library) 里实现 IBiometricsFace.hal 的所有方法。接下来我们就来看看 hardware/interfaces/biometrics/face/1.0/ 目录下的源代码。IBiometricsFace.halhardware/interfaces/biometrics/face/1.0/IBiometricsFace.halpackage andr
2020-09-07 00:11:09
949
原创 Android 隐藏锁机
Android 隐藏锁机Android 按电源键面部解锁或者抬手亮屏以及通过各种手势亮屏面部解锁,为了让用户感受不到解锁的速度快慢,会做一些特殊处理。比如本文要说的隐藏锁机,那什么时候又显示锁机呢?最好是解锁成功后立马显示锁机,同时移除锁机。隐藏锁机的同时需要拦截背光,否则就直接看到桌面了。显示锁机的同时需要释放拦截背光,否则手机就是黑屏的,无法设置背光,带来不好的用户体验。解锁成功后需要移除锁机,否则解锁成功还是看到锁屏,无法进到桌面或正在打开的应用。下面从代码看看对锁机的相关处理:public c
2020-08-04 13:26:09
904
原创 Android DevicePolicyManager
Android DevicePolicyManager用于管理在设备上实施策略的公共接口。可以用来禁用多个系统应用,例如系统相机、指纹解锁、面部解锁、生物识别解锁等。这个类的大多数客户端必须和系统被注册为设备管理员。此外,设别管理员可能被注册为个人资料或设备所有者。一个给定的方法可以访问所有设备管理员除非那个方法的文档指定它被限制为设备或个人资料所有者。任何调用 api 的应用只能将其拥有的设备管理员组件作为参数传递。否则,会抛出安全异常 SecurityException。需要 PackageMana
2020-08-04 13:21:49
1452
原创 Android StrongAuth 机制
Android StrongAuth 机制Strong Authentication 顾名思义强认证,即当生物识别失败次数过多时需要输入密码解锁,此时生物识别被禁用。常见的还有启动设备首次解锁需要输入密码、72 小时未输入密码禁用生物识别,需要输入密码解锁,所以当我们遇到需要输入密码以进一步确保安全时,就意味着我们太久没用过密码解锁了。Android 中通过 LockPatternUtils 来管理生物识别是否可用,其中 StrongAuthTracker 用来跟踪全局强认证状态。public sta
2020-08-04 13:16:04
928
原创 Android 耗电问题之一
Android 耗电问题之一在应用内打开了相机,退出后未关相机,这会导致耗电问题。不管是 Android 还是 iOS,相机和手电筒是无法同时打开的,不信你可以试试。所以相机未关最直观的表现就是不能打开手电筒,直到关闭相机。如果相机未关,可以通过打开拍照的相机,再关闭,使应用打开的相机被关闭,否则手机的电量很快就会被耗光。对于相机,有一个防呆机制,就是打开了相机,一定要有配对的关闭相机,保证相机不用时能被关闭,除非用户需要长时间打开相机。有很多场景需要用到相机,那不可避免要建立防呆机制。最常见的就是拍
2020-08-04 02:07:02
530
原创 如何判断导航键是否打开
如何判断导航键是否打开原生的方法:也是判断大多数手机导航键是否打开的方法。public boolean hasNavigationBar (Resources resources){ int id = resources.getIdentifier("config_showNavigationBar", "bool", "android"); return id > 0 && resources.getBoolean(id);}这个 Resources
2020-08-04 02:00:59
777
原创 Android HandlerThread 和 Looper
Android HandlerThread 和 LooperHandlerThread 是一个包含一个 Looper 对象的线程。这个 Looper 对象可以用来创建多个 Handler 对象。注意 HandlerThread 和普通的线程没什么两样,Thread.start() 仍需被调用。HandlerThread 的 getLooper() 方法返回和这个线程关联的 Looper 对象。如果这个线程还没被启动或者因为其他原因 isAlive() 方法返回 false,这个方法将返回一个空对象。如果
2020-08-04 01:50:08
686
1
原创 Android Handler 机制
Android Handler 机制Handler 与消息的传递和处理有关。Handler 可以用来发送和处理消息,有专门的 Message 类构建消息,还可以通过线程的消息队列处理 Runnable 对象,而 Runnable 对象就是一个子线程,所以 Handler 的用处真是太大了。每一个 Handler 实例会和一个单一的线程以及线程的消息队列关联,创建的 Handler 对象会绑定一个 Looper 对象,Looper 可以理解为一个循环者,处理 Handler 传递过来的消息和 Runna
2020-08-04 01:45:29
162
原创 工欲善其事,必先利其器
工欲善其事,必先利其器。作为一个 Android 开发者,给大家讲讲学习 Android 开发前该做的准备工作,准备好工具,提高自己的起点,坚决执行你可以在达成目标的路上事半功倍。工欲善其事,必先利其器文章里面提到一个策略,Android 开发之前先提高自己的起点,这样达成目标可以事半功倍。其实同理,做其他事之前也可以先提高自己的起点。...
2020-02-23 11:29:47
226
原创 Windows 扩展 C 盘扩展卷按钮显示灰色怎么办
压缩 C 盘先压缩 C 盘,输入一个很小的空间量,比如 8,然后点击压缩按钮会看到在 C 盘旁边生成一个未分配的盘此时再右键 C 盘,看到扩展卷按钮可点击扩展 C 盘选择磁盘,把未分配的盘放到已选,再下一步,即可点击完成,即可此时发现未分配的盘没有了,合并到 C 盘了...
2020-02-14 12:25:44
8910
3
原创 年度总结
元旦快乐2020,新年第一天,祝大家元旦快乐。回顾 2019,写一篇总结作为纪念,也为了更好地指导新的一年如何前进。过去一年主要由几件大事组成,包括实习、毕业设计、春招、入职、工作等。实习实习是在 2018 年 9 月开始的秋招找的。当时笔面试了很多公司,最后只拿到了 ZTE 和 FDD 的 offer,后者的 offer 比前者先到,签了后者才收到前者的通知,当时内心确实比较急索性签了 F...
2020-01-02 00:16:51
176
原创 Hexo NexT 主题添加评论和文章阅读量
前言折腾了畅言、gitalk、disqus 这些评论 API,最后都以失败告终,最终试到 valine 的时候终于成功,顺便把文章阅读量统计也搞定了。下面把我的经验写下来分享给大家,欢迎评论。Valine 介绍Valine - 一款快速、简洁高效的无后端评论系统。NexT 主题已经集成了 Valine 评论系统,只要填写一些参数即可使用。配置 LeanCloud注册打开 LeanCl...
2019-12-25 09:20:04
841
原创 摄影历程-第一章
缘起为什么要讲摄影?其实只是想记录自己的学习经历,有空的时候经常看看加深记忆,如果我的经验能帮助到大家就更好了。构图常见的构图方式:居中构图(中心构图)对称构图对角线构图三角形构图(偏离中心构图)井字相交点构图(三分法构图)层次构图前景构图延伸线构图极简构图框式构图(强烈的明暗对比)正方形构图对比常见的对比方式:明暗对比新旧对比(古今对比)新旧对比,例...
2019-12-22 00:54:02
158
原创 西藏之旅
写在最前,我又回来了。接下来继续输出!记第一次西藏旅游去西藏的想法其实在 18 年秋季期就有了,考虑到工作后可能没那么多时间,所以打算毕业前五个人来一次西藏游。但是锡基学医五年制,学业繁忙,基本不考虑去了,剩下 weekend 、老yin 、大榄、我可以考虑。当时 weekend 发了飞猪上报团去珠峰的路线,感觉价格也不贵,但是因为不明确毕设的忙碌程度所以我们没定下具体的时间。春节回到家我...
2019-12-16 00:21:51
266
原创 选择排序 Selection Sort
选择排序是一种在原来位置上的排序,即空间复杂度为 O(1),它把要排序的数组分为两部分,已排序的部分和待排序的部分,假设要将待排序的数组按升序排列,已排序的部分在左边,大小每次加一,待排序的部分找到最小的元素和该部分最左边的元素交换位置,然后待排序的部分大小减一,直到为一停止,因为一个元素是有序的。...
2019-03-27 19:14:43
164
原创 LeetCode 3. Longest Substring Without Repeating Characters(Java)解题报告
RequirementGiven a string, find the length of the longest substring without repeating characters.Example 1:Input: “abcabcbb” Output: 3 Explanation: The answer is “abc”, which the length is 3....
2019-03-21 23:05:10
117
原创 插入排序 Insertion sort
插入排序是一个简单的排序算法,一次排序一项构建最终的有序数组。在大列表排序上相比于更先进的算法例如快速排序、堆排序、归并排序就不那么有效了。然而,插入排序有如下优点:简单实现:Jon Bentley 展示了一个 3 行代码的 C 版本和一个 5 行代码的优化版本。对小数据集有效,非常像其他平方排序算法。在实践中比其他平方算法例如选择排序、冒泡排序更有效。自适应:对已经排序的数据集有效:时...
2019-03-19 13:25:41
177
原创 LeetCode 3. Longest Substring Without Repeating Characters(Java)解题报告
RequirementGiven a string, find the length of the longest substring without repeating characters.Example 1:Input: “abcabcbb” Output: 3 Explanation: The answer is “abc”, which the length is ...
2018-09-11 10:32:19
171
原创 为哈希表设计键Hash Table Design the Key
有时候使用哈希表时已有的数据不能直接作为键Key使用,这就需要我们利用已有的数据设计键Key。 1.当字符串或数组的每个元素的顺序无关紧要时,可以使用排序过的字符串或数组作为键。 2.当只关心每个值的偏移量,通常是对第一个值的偏移量时,可以使用偏移量作为键。 3.对于一棵树,有时候你可能想直接使用节点作为键。但大多数情况,子树的序列化可能是一个更好的想法。 4.对于一个矩阵,可...
2018-09-10 20:35:05
318
原创 BFS&DFS广度优先搜索和深度优先搜索
Queue and BFSBFS是Breath First Search的缩写,就是大家所熟悉的广度优先搜索。通俗的讲,BFS就是一层一层地搜索,可以利用队列Queue先进先出的特性实现广度优先搜索。 下面提供两个BFS的模板: Template I/** * Return the length of the shortest path between root and targ...
2018-09-04 17:00:24
226
原创 递归地解决问题Solve Problem Recursively
自顶向下解决方法”Top-down” Solution例如找一颗二叉树的最大深度:private int answer; // don't forget to initialize answer before call maximum_depthprivate void maximum_depth(TreeNode root, int depth) { if (root ...
2018-08-16 16:09:09
332
原创 分治策略 Divide and Conquer
分治策略最简单的分治算法应用 1.计算阶乘public static int factorial(int n) { assert(n >= 0);// pre-condition if (n == 0) return 1; else return n * factorial(n-1); // post-condition: returns n!...
2018-07-20 11:53:07
184
原创 二分搜索 Binary Search
预处理给定一个数组要搜索目标值,返回目标值的位置(下标)。如果数组是无序的,那么就要做排序预处理。二分搜索模板一public int binarySearch(int[] nums,int target){ if(nums==null){ return -1; } int left=0,right=nums.length-1; whi...
2018-07-18 15:49:46
204
原创 相机矩阵
相机矩阵固有参数(内参)焦距、图像传感器格式、主点外在参数(外参)从3D世界坐标到3D相机坐标的坐标系变换 定义了相机中心的位置和相机在世界坐标的头部畸变系数相机矩阵的分解相机中心相机姿态定义一个描述相机中心在世界坐标系中的位置的向量C,然后让Rc代表相机在世界坐标系旋转到当前姿态需要的旋转矩阵。那么描述相机姿态的变换矩阵就是(Rc|C...
2018-07-17 08:20:00
801
原创 矩阵求导
矩阵求导0 布局约定分母布局 分子布局 1 关于标量的求导1.1 标量关于标量X的求导1.2 向量关于标量X的求导1.3 矩阵关于标量X的求导2 关于向量的导数2.1 标量关于向量X的导数y对列向量X求导后得到梯度向量(行向量)2.2 向量关于向量X的导数n维列向量y对n维列向量X求导得到n维方阵,叫做Jacobian矩阵...
2018-07-17 08:18:50
222
原创 LeetCode 599 Insert into a Cyclic Sorted List (Java)
[LintCode] 599 Insert into a Cyclic Sorted List 解题报告DescriptionGiven a node from a cyclic linked list which has been sorted, write a function to insert a value into the list such that it remains...
2018-07-16 16:54:44
401
原创 A Survey on semi-supervised feature selection methods
特征选择方法可以分为3类:filter, wrapper and embedded 过滤器,包装和嵌入式 Filter methods Wrapper methods Embedded methods根据类标注信息分为3类:supervised feature selection, unsupervised feature selection and semi-su...
2018-06-24 21:28:16
692
原创 2017-3学习心得
无监督特征选择被认为是一个更难的问题,因为缺少引导相关信息搜索的类标记。方差和可分离性Variance score暂且译为方差得分 可能是最简单的半监督特征评估Laplacian Score拉普拉斯得分 属于光谱特征选择家族 用于无监督特征选择Lr=ai,j˚(ffi−ffj)2Sijai˚(fri−mr)2DiiLr=ai,j˚(ffi−ffj)2Sijai...
2018-06-24 20:40:45
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人