蓝牙HID——android利用手机来解锁电脑/平板/iPhone

news/2024/11/25 15:23:21/

前言

此篇文章基于上一篇HID键盘的开发文章:
蓝牙HID——将android设备变成蓝牙键盘(BluetoothHidDevice)
可先了解上篇文章的内容再来浏览此篇。

开发思路

首先需要建立HID键盘连接,参考上篇。

   mBluetoothHidManager = new BluetoothHidManager(this);mBluetoothHidManager.setBluetoothHidStateListener(this);

其次要进行密码设置并保存,这里设置了3种类型的密码:4位数字、6位数字、20位以内密码文本,这些都可以自定义密码类型。

                if (checkedId == R.id.rb_four_number) {etPassword.setInputType(EditorInfo.TYPE_CLASS_NUMBER);InputFilter[] filters1 = {new InputFilter.LengthFilter(4)};etPassword.setFilters(filters1);etPassword.setHint("请输入4位数字");mPasswordType = TYPE_FOUR_NUMBER;} else if (checkedId == R.id.rb_six_number) {etPassword.setInputType(EditorInfo.TYPE_CLASS_NUMBER);InputFilter[] filters2 = {new InputFilter.LengthFilter(6)};etPassword.setFilters(filters2);etPassword.setHint("请输入6位数字");mPasswordType = TYPE_SIX_NUMBER;} else {etPassword.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);InputFilter[] filters3 = {new InputFilter.LengthFilter(20)};etPassword.setFilters(filters3);etPassword.setHint("请输入不大于20位密码");mPasswordType = TYPE_TEXT;}

在这里插入图片描述
接着检查是否设置密码和系统设置解锁密码:

    private void checkUnlock() {String password = mPasswordSp.getString(KEY_PASSWORD, null);if (TextUtils.isEmpty(password)) {showPasswordDialog();} else if (!mKeyguardManager.isKeyguardSecure()) {//判断设备有没有设置解锁密码Toast.makeText(this,"当前设备未设置解锁密码,已直接解锁", Toast.LENGTH_LONG).show();} else {showUnlockScreen();}}

手机设置了系统解锁后即可跳转到解锁界面:

    /***跳转到系统解锁页面*/private void showUnlockScreen() {Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);if (intent != null) {startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);}}

解锁成功后毁掉RESULT_OK

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Log.d(TAG, "onActivityResult:" + requestCode + "  resultCode:" + resultCode);if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {if (resultCode == RESULT_OK) {unlockDevice();} else {Toast.makeText(this, "解锁错误", Toast.LENGTH_SHORT).show();}}}

解锁成功后发送按键报告给设备端。

private void unlockDevice() {if (mBluetoothHidManager.isConnected()) {String password = mPasswordSp.getString(KEY_PASSWORD, "");if (TextUtils.isEmpty(password)) {return;}int passwordType = mPasswordSp.getInt(KEY_PASSWORD_TYPE, TYPE_TEXT);//等待激活界面waitForEnterPassword(1);if (passwordType == TYPE_FOUR_NUMBER || passwordType == TYPE_SIX_NUMBER) {for (char code : password.toCharArray()) {mBluetoothHidManager.sendKeyWithRelease(KeyboardHidUtils.getHidCode(String.valueOf(code)));}} else {for (char code : password.toCharArray()) {String s = String.valueOf(code);if (KeyboardHidUtils.isKeyWithShift(s)) {mBluetoothHidManager.sendKeyWithShift(KeyboardHidUtils.getHidCode(s));} else {mBluetoothHidManager.sendKeyWithRelease(KeyboardHidUtils.getHidCode(s));}}}mBluetoothHidManager.sendKeyWithRelease(KeyboardHidUtils.getHidCode("enter"));} else {Toast.makeText(this, "请检查蓝牙HID设备是否连接", Toast.LENGTH_SHORT).show();}}

这里兼容输入大小写以及特殊符号,主要通过shift按键来切换大些和特殊字符,同时发送释放按键以免设备识别长按。
同时每个设备需要发送按键即入激活界面

  waitForEnterPassword(1);private static final long WAIT_TIME = 500;private void waitForEnterPassword(int times) {for (int i = 0; i < times; i++) {mBluetoothHidManager.sendKeyWithRelease(KeyboardHidUtils.getHidCode("back")); //用来激活输入界面try {//激活输入界面后延迟等待输入密码防止未显示输入框发送无效Thread.sleep(WAIT_TIME);} catch (InterruptedException e) {e.printStackTrace();}}}

这里发送backspace按键,这样保证能正确进入界面,延迟等待一定时间才能进入密码输入界面。

解锁电脑

来看下解锁电脑的效果:
在这里插入图片描述

由于本人手机设置指纹解锁,所以调起了系统的指纹解锁。如果手机设置了人脸识别解锁,也可以进行人脸识别电脑设备。

解锁iPhone

自从iPhone砍掉了指纹解锁后,让很多人苦恼了很长一段时间。
知道推出人脸口罩解锁才减少吐槽的频率。
于是可以自己给苹果增加指纹解锁,前提是有一台指纹解锁的手机并且不怕费劲。按照上面的做法进行解锁就可以达到指纹解锁iPhone的目的。
需要注意iPhone需要两次按键才进入密码输入界面,并且需要一定的间隔才能保证密码不断续,需要把等待次数修改为2以上。

 //等待激活界面waitForEnterPassword(2);

效果如下:
在这里插入图片描述


http://www.ppmy.cn/news/441152.html

相关文章

苹果电脑双系统如何切换,CrossOver兼容双系统无需切换轻松帮你解决

苹果笔记本电脑双系统如何切换&#xff1f;其实就和我们在windows电脑上装双系统的切换方法差不多。只要进入开机启动项界面选择要登陆的系统即可&#xff0c;下面我们一起来看看具体的操作步骤&#xff1a; 首先需要在电脑上安装好双系统&#xff0c;然后再选择需要的系统进行…

FreeRTOS实时操作系统(二)系统文件代码学习

文章目录 前言系统配置任务创建任务创建删除实践 前言 接着学习正点原子的FreeRTOS教程&#xff0c;涉及到一些详细的系统内文件代码 系统配置 可以通过各种的宏定义来实现我们自己的RTOS配置&#xff08;在FreeRTOSconfig.h&#xff09; “INCLUDE”&#xff1a;配置API函数…

大功率双路直流电机驱动板的设计源文件

大功率双路直流电机驱动板的设计源文件&#xff0c;包括原理图、PCB、原理图与PCB器件库、BOM清单、stm32测试源代码。 &#xff08;注意&#xff1a;出售的是设计资料&#xff0c;出售的是资料&#xff0c;不是实际的产品哈&#xff09;&#xff0c;另外可对该图的设计原理&am…

中大功率电源驱动解决方案

描述: Meraki 基于120V BCD工艺平台和高速驱动平台&#xff0c;率先在国内推出了系列高速驱动产品。产品涵盖高速半桥驱动、高速低边驱动。可以广发应用于充电桩模块、服务器电源、砖块电源、汽车DCDC电源、工业DCDC电源、矿机电源。 参考设计: 以48V目前服务器电源为例&…

【硬件】SX1308——DC-DC升压方案

今天介绍的DC-DC升压方案是SX1308. 特性&#xff1a; 输入电压&#xff1a;2V~24V 输出电流&#xff1a;4A 开关工作频率&#xff1a;1.2MHz 效率&#xff1a;最高可达97% 电路图&#xff1a; 电池采用的是锂电池3.7V作为输入&#xff0c;通过SX1308进行升压&#xff0c;…

DX9612单相全波无刷直流风扇驱动芯片

DX9612单相全波无刷直流风扇驱动芯片 概要 DX9612是一款单相直流无刷马达驱动芯片&#xff0c;其通过PWM直接输入模式高效控制直流无刷风扇马达 运转。其内置了最低转速设定或停转设定功能、软启动、锁定保护、自动重启、风扇转速侦测输出、风 扇的转动侦测输出、过热保护、过电…

【扩展】电机驱动(DRV8870)

电机驱动&#xff08;DRV8870&#xff09; &#xff08;一&#xff09;电路功能 本电路为电机驱动模块&#xff0c;可以用来实现电机的驱动或者其它动力部件、LED灯亮度等的控制。此外&#xff0c;8870自带过流保护功能&#xff0c;通过采样电阻可以控制触发保护的电流阈值。…

超声波驱动电源,ATA-2082双极性驱动电源

超声波驱动电源&#xff0c;ATA-2082双极性驱动电源为实现高频传感器的应用&#xff0c;研制一种基于压电陶瓷的振动台&#xff0c;用PZT压电陶瓷片堆叠为元件&#xff0c;用**超声波驱动电源**、信号发生器、压电陶瓷片构成的实验测试台&#xff0c;对信号源输出信号进行功率和…