蓝牙HID——android利用手机来解锁电脑/平板/iPhone
前言
此篇文章基于上一篇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
。
@Override
protected 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);
效果如下: