前言
此篇文章基于上一篇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);
效果如下: