android广播实现PIN码设置
摘要:本文通过广播的方式调用系统设置PIN码的流程实现类似锁机的功能,可供开发人员在联网状态下后台推送消息进行锁机/解锁。有需要的同学可以参考PIN码的流程改为密码等其他形式。
1 定义一个广播接收器
广播action:android.intent.action.LOCKDEVICE
boolean extra: lock (true:锁机/false:解锁)
String extra: password (6位数字密码,后续代码会进行合法性检测)
<receiver android:name=".LockDeviceReceiver"android:exported="true"><intent-filter> <action android:name="android.intent.action.LOCKDEVICE"/></intent-filter></receiver>
2 功能实现
代码部分注释为 android 9之前的实现方式。
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.PasswordValidationError.RECENTLY_USED;import android.app.admin.PasswordMetrics;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
import android.util.Log;import com.android.internal.widget.LockPatternChecker;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockscreenCredential;
import com.android.internal.widget.PasswordValidationError;import java.util.Collections;
import java.util.List;/*** Boot completed receiver. used to reset the app install state every time the* device boots.**/
public class LockDeviceReceiver extends BroadcastReceiver {private static String TAG ="LockDeviceReceiver";private byte[] mPasswordHistoryHashFactor;private LockPatternUtils mLockPatternUtils;private LockscreenCredential mChosenPassword;private LockscreenCredential mCurrentCredential;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if ("android.intent.action.LOCKDEVICE".equals(action)) {boolean isLock = intent.getBooleanExtra("lock", false);String password = intent.getStringExtra("password");mLockPatternUtils = new LockPatternUtils(context);if (isLock) {lockDevice(context, password);} else {unlockDevice(context, password);}return;}}private void lockDevice(Context context, String password) {mChosenPassword = LockscreenCredential.createPin(password);//int mRequestedQuality = mLockPatternUtils.computePasswordQuality(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, password, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);if (password.length() == 6 && validatePassword(mChosenPassword)) {//mLockPatternUtils.setCredentialRequiredToDecrypt(false);//mLockPatternUtils.saveLockPassword(password, null, mRequestedQuality, UserHandle.myUserId());final boolean success = mLockPatternUtils.setLockCredential(mChosenPassword, LockscreenCredential.createNone(), UserHandle.myUserId());Log.d(TAG, "lockDevice " + (success ? "success" : "unsuccess"));} else {Log.d(TAG, "invalid password!");}}private void unlockDevice(Context context, String password) {LockscreenCredential credential = LockscreenCredential.createPin(password);LockPatternChecker.checkCredential(mLockPatternUtils,credential,UserHandle.myUserId(),new LockPatternChecker.OnCheckCallback() {@Overridepublic void onChecked(boolean matched, int timeoutMs) {if (matched) {//mLockPatternUtils.setSeparateProfileChallengeEnabled(UserHandle.myUserId(), true, credential);//mLockPatternUtils.clearLock(password, UserHandle.myUserId());//mLockPatternUtils.setLockScreenDisabled(true, UserHandle.myUserId());final boolean success = mLockPatternUtils.setLockCredential(LockscreenCredential.createNone(), LockscreenCredential.createPinOrNone(password), UserHandle.myUserId());mLockPatternUtils.setLockScreenDisabled(true, UserHandle.myUserId());Log.d(TAG, "unlockDevice " + (success ? "success" : "unsuccess"));} else {Log.d(TAG, "Password do not match");}}});}boolean validatePassword(LockscreenCredential credential) {final byte[] password = credential.getCredential();List<PasswordValidationError> mValidationErrors = PasswordMetrics.validatePassword(new PasswordMetrics(CREDENTIAL_TYPE_NONE), PASSWORD_COMPLEXITY_NONE, true, password);if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory(password, getPasswordHistoryHashFactor(), UserHandle.myUserId())) {mValidationErrors =Collections.singletonList(new PasswordValidationError(RECENTLY_USED));}return mValidationErrors.isEmpty();}private byte[] getPasswordHistoryHashFactor() {if (mPasswordHistoryHashFactor == null) {mPasswordHistoryHashFactor = mLockPatternUtils.getPasswordHistoryHashFactor(mCurrentCredential != null ? mCurrentCredential: LockscreenCredential.createNone(), UserHandle.myUserId());}return mPasswordHistoryHashFactor;}
}
3 其他注意
广播需要在系统管理中添加,避免被拦截。
相关文章:
android广播实现PIN码设置
摘要:本文通过广播的方式调用系统设置PIN码的流程实现类似锁机的功能,可供开发人员在联网状态下后台推送消息进行锁机/解锁。有需要的同学可以参考PIN码的流程改为密码等其他形式。 1 定义一个广播接收器 广播action:android.intent.action…...
Mac 需要杀毒软件?
大部分 mac用户普遍认为 Apple mac 不受病毒和恶意软件的影响。这导致许多 Mac 用户误以为无需为 Mac 安装防病毒软件,但事实并非如此。 在这篇文章中,将深入探讨 Mac 安全性的细节,探索针对 Apple 设备的恶意软件类型,并为您…...
Java | Leetcode Java题解之第472题连接词
题目: 题解: class Solution {Trie trie new Trie();public List<String> findAllConcatenatedWordsInADict(String[] words) {List<String> ans new ArrayList<String>();Arrays.sort(words, (a, b) -> a.length() - b.length(…...
CUDA Graphs学习与实验
CUDA Graphs学习与实验 一.参考链接二.测试方案三.测试代码 CUDA图(CUDA Graphs)为CUDA引入了一种全新的工作提交模型。它允许将一系列操作(如内核启动)以图的形式表示,并通过依赖关系将这些操作连接起来。这种图的定义…...
【自注意力与Transformer架构在自然语言处理中的演变与应用】
背景介绍 在自然语言处理(NLP)领域,序列到序列(seq2seq)模型和Transformer架构的出现,极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络(RNN&…...
LabVIEW交直流接触器动态检测系统
LabVIEW软件与霍尔传感器技术结合的交直流接触器动态检测系统通过实时数据采集和处理技术,有效地测量并分析交直流接触器在吸合及吸持阶段的电流和电压变化,以及相应的功率消耗,从而优化电力和配电系统的性能和可靠性。 项目背景 交直流接触…...
Unity3D中基于四叉树的范围检测算法详解
在游戏开发中,碰撞检测和范围检测是常见的需求,尤其是在处理大量物体时,传统的暴力检测法(即每个物体与其他所有物体进行碰撞检测)会消耗大量的计算资源,导致性能下降。为了优化这一过程,四叉树…...
k8s网络通信
k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,calico等 CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥,虚拟网卡,多个容器共用一个虚…...
07 欢乐的跳
题目: 代码: #include<bits/stdc.h> using namespace std; #define M 1000005int main() {int n;cin>>n;int a[M]{0};for(int i0;i<n;i){cin>>a[i];}int c[M]{0};for(int i1;i<n;i){c[i]abs(a[i]a[i1]);}sort(c1,cn); // 注意f…...
【韩顺平Java笔记】第8章:面向对象编程(中级部分)【262-271】
文章目录 262. 回顾上一章内容263. IDEA介绍263.1 IDEA 介绍263.2 Eclipse 介绍 264. IDEA下载265. IDEA使用1257. IDEA使用2268. IDEA使用3268. 269. 270. IDEA快捷键1,2,3271. IDEA模板 262. 回顾上一章内容 看视频 263. IDEA介绍 263.1 IDEA 介绍 IDEA 全称 IntelliJ ID…...
GNU链接器(LD):输入分区的垃圾回收及保护处理(KEEP命令)介绍
0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…...
论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models
摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力,也就是说,这些模型可以通过对由几个输入输出示例构建的提示进行条件反射,直接应用于解决大量下游任务。然而,先前的研究表明,由于训练示例、示例顺序和提示…...
【分布式微服务云原生】战胜Redis脑裂:深入解析与解决方案
战胜Redis脑裂:深入解析与解决方案 摘要: Redis脑裂问题(Split Brain Syndrome)是分布式系统中的一个常见且复杂的问题,通常发生在网络分区或主节点出现问题时。本文将详细探讨脑裂的主要原因、导致的问题以及有效的解…...
数据治理与可持续发展:开启企业价值新模式——The Open Group 2024生态系统架构·可持续发展年度大会邀您共襄盛举
在当今数字化转型的浪潮中,企业正面临着前所未有的机遇和挑战。当数据治理遇上可持续发展,企业价值的新模式应运而生。那么,如何在数字化时代实现数据治理与可持续发展的融合,推动企业价值的飞跃? The Open Group 202…...
数据库的分类及主流数据库
一、数据库的分类 (一)关系型数据库(RDBMS) 定义与原理 关系型数据库是基于关系模型建立的数据库。它以表格(关系)的形式组织数据,每个表格包含行(记录)和列࿰…...
Qt C++设计模式->备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获并保存对象的内部状态,以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复,常用于实现撤销…...
Vue使用@别名替换后端ip地址
1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…...
强大的PDF到Word转换工具
Solid Converter:强大的PDF到Word转换工具推荐 在日常工作和学习中,PDF是最常用的文件格式之一。然而,编辑PDF文档并不总是那么方便,尤其是当你需要将PDF文件转换为Word文档时。Solid Converter 是一款强大的工具,专为…...
js进阶——深入解析JavaScript中的URLSearchParams
深入解析 JavaScript 中的 URLSearchParams 在现代Web开发中,我们经常需要处理URL中的查询参数,尤其是在构建动态Web应用时。这些查询参数(query parameters)通常以 ?keyvalue&key2value2 的形式存在。JavaScript 提供了一个…...
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
前提:咱们在wsl-Ubuntu上,有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项,需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来࿰…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
