前言

此篇文章基于上一篇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);

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐