实现一个带有指纹加密功能的笔记本(Android)第二部分

上文基本完成了整个笔记本的笔记功能的实现,接下来记录实现指纹识别加密以及一些小注意事项。

首先判断该手机是否具备指纹识别的硬件功能和用户是否开启指纹识别。

    public boolean isFinger() {
        //用来检查是否有指纹识别权限
        if(checkCallingOrSelfPermission(Manifest.permission.USE_FINGERPRINT) ==
                PackageManager.PERMISSION_GRANTED) {
            if (!manager.isHardwareDetected()) {
                Toast.makeText(this, "没有指纹识别模块", Toast.LENGTH_SHORT).show();
                return false;
            }
            if (!mKeyManager.isKeyguardSecure()) {
                Toast.makeText(this, "没有开启锁屏密码", Toast.LENGTH_SHORT).show();
                return false;
            }
            if (!manager.hasEnrolledFingerprints()) {
                Toast.makeText(this, "没有录入指纹", Toast.LENGTH_SHORT).show();
                return false;
            }
        }
        return true;
    }

开始指纹识别

    public void startListening(FingerprintManager.CryptoObject cryptoObject) {
        //android studio 上,没有这个会报错
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "没有指纹识别权限", Toast.LENGTH_SHORT).show();
        }
        manager.authenticate(cryptoObject, mCancellationSignal, 0, mSelfCancelled, null);
    }

首先查验用户是否赋予了本软件使用指纹识别的权限,然后进行指纹识别请求。其中authentication方法需要五个参数,如下

    @RequiresPermission(USE_FINGERPRINT)
    public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
            int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) {
        authenticate(crypto, cancel, flags, callback, handler, UserHandle.myUserId());
    }

第一个参数是加密对象可以使用对称式和非对称式加密,或者不使用加密直接用null

第二个参数是一个被用来取消认证的对象,直接 new CancellationSignal()就可以。

第三个参数是可选标志,推荐是0

第四个参数是一个接受认证事件的对象

第五个参数是一个可选的回调事件处理器

以下是第四个认证事件的处理,每个结果的处理过程如下

FingerprintManager.AuthenticationCallback mSelfCancelled = new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {
            //但多次指纹密码验证错误后,进入此方法;并且,不能短时间内调用指纹验证
            Toast.makeText(MainActivity.this, errString, Toast.LENGTH_SHORT).show();
            showAuthenticationScreen();
        }
        @Override
        public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
            //出现错误,可能是手指移动过快等问题        Toast.makeText(MainActivity.this, helpString, Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {       //认证成功,可以进入加密文档
            noteAdapter.openNote();
        }
        @Override
        public void onAuthenticationFailed() {
            Toast.makeText(MainActivity.this, "指纹识别失败", Toast.LENGTH_SHORT).show();
        }
    };

为防止多次验证不成功,但是想通过锁屏密码进行解锁,可以使用

    private void showAuthenticationScreen() {
        Intent intent = mKeyManager.createConfirmDeviceCredentialIntent("finger", "指纹识别失败次数过多,请输入锁屏密码");
        if (intent != null) {
            startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
            // Challenge completed, proceed with using cipher
            if (resultCode == RESULT_OK) {
                noteAdapter.openNote();
            } else {
                Toast.makeText(this, "密码验证失败", Toast.LENGTH_SHORT).show();
            }
        }
    }

这样整个指纹解锁的流程就完成了

下面叙述一下整个项目中需要注意的一些地方

1.关于新建笔记刷新问题,之前是在noteactivity的ondestory的时候存储笔记,在noteadaper的getItemCount中刷新数据库中笔记数量,进行显示。然而回到主页面的时候发现最新建的笔记没有出现在列表上,这是因为activity生命周期的问题,通过log记录下来,发现noteadapter的getItemCount的执行要早于noteactivity的ondestory函数,而晚于onpause函数,所以将storeNote放在onpause中,而不是ondestory。

2.修改笔记则可以直接在mainactivity的onresume函数中写noetAdapter.notifyDataSetChanged就可以了。

2. 新建一个笔记的时候,可能用户只是不小心点击了一下新建笔记,而并不想新增一条,则可以在存储笔记的时候进行个简单判断,内容是否为空。

3. 主页面笔记内容全显示问题,可以设置TextView的以下属性,来显示部分内容即可

        android:maxLines="1"
        android:lines="2"
        android:ellipsize="end"

同时,还要注意在加载内容的时候要将加密信息内容隐去,在这里我将加密信息统一显示为“核心机密!!!”.

原文地址:https://www.cnblogs.com/leaveMeAlone/p/8932804.html

时间: 2024-08-29 23:57:08

实现一个带有指纹加密功能的笔记本(Android)第二部分的相关文章

实现一个带有指纹加密功能的笔记本(Android)第一部分

自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.greenrobot:greendao:3.2.0' compile 'net.zetetic:android-database-sqlcipher:3.5.1' compile 'com.getbase:floatingactionbutton:1.10.1' 其中greendao是一款比较好用的开源数据

分享一个带有合计行功能的DataGridView扩展

因为一个Winform的项目中需要用到带有合计行的表格,并且需要满足以下需求: 合计行可自动对需要求和的列进行求和计算; 合计行必须固定(冻结)在表格的最底部,且其位置不受滚动条的滚动而移动; 可以设置合计行单元格的数据展示格式. 本以为winform程序出来已经这么多年了,这个本也是个比较基础的功能,网上应该有很多现成的例子,便想着直接从网上找个例子用到项目中即可,无奈找了很久也没有见一个合适的实现,迫于无奈,只能动手自己写了一个DataGridView的扩展.并在这里整理出来,以分享给后续有

在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在"D:\java"文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 myPackage 包中创建一个YMD类,该类具有计算今年的年份.可以输出一个带有年月日的字符串的功能.设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名.年龄.出生日期.程序使用YMD的方法来计算年龄. 主要考包的运用 用到java.util.Calendar

Kitkat的加密功能对应用做了什么?

本文只分析手机加密后,启动到输入密码的界面的流程. 一. 加密后,系统服务针对加密功能做了什么? 最先启动的是SystemServer,调用ServerThread的initAndLoop()方法,开始启动系统的其他的服务. 在该文件中搜索"crypt",得到如下内容: 1. private static final String ENCRYPTING_STATE = "trigger_restart_min_framework"; private static f

给 Qt sqlite 增加加密功能

整合sqlite代码 开源的sqlite中没有实现加密的功能,所以如果需要加密功能,需要自己实现 sqlite3_keysqlite3_rekey 等相关函数 不过开源的 wxsqlite3中已经实现了加密,所以只要将这里的代码整合到qt 中就行,主要是将其实现的 sqlite3_key sqlite3_rekey 等函数添加到 qt 的 sqlite3.c 中 这里有一份已经整合好的代码qt_sqlite_driver.zip 直接解压到 qtbase\src\3rdparty 下就行 整合主

设置-安全-手机加密功能讲解

        此功能可以用来加密手机上的所有数据,包括 Google 帐户.应用数据.音乐和其他媒体信息.已下载的信息等.如果执行了加密操作,您每次开机时都必须输入数字 PIN 或密码. 请注意,上述 PIN 或密码与您在未加密状态下解锁手机时所用的相同,无法单独设置. 警告:加密操作无法撤消.要将手机恢复为未加密状态,唯一的方法是恢复出厂设置,但这会清除您的所有数据. 如果您的手机遭窃,加密可提供额外保护,某些组织可能要求或建议使用加密.在启用加密前,请先咨询您的系统管理员.很多情况下,您设

用struts2做一个带有图片效果的登陆验证码

我们在登陆网站的时候总是会有带有图片验证功能的验证码,它是怎么做出来的了,今天我就详细的将每一步步骤写出来. 1.在action层 1 package cn.itcast.javaee.js.checkcode; 2 3 import java.io.PrintWriter; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts2.ServletActionContext; 6 import com

BitLocker加密功能

BitLocker加密功能 u 案例需求 怎样使用Windows 7的BitLocker功能加密磁盘驱动器,保护文件数据? u 知识提示 微软在Windows 7操作系统旗舰版中为用户提供了一种强悍的BitLocker加密功能,该技术最早出现在Vista系统中,BitLocker机密技术能够同时支持FAT和NTFS两种格式,用来加密保护用户数据,可以加密电脑的整个系统分区,页可以加密可移动的便携存储设备,如U盘和移动硬盘等.其中对U盘等移动设备存储进行加密的BitLocker TO GO就是最新

添加指纹识别功能

iPhone 5S开始硬件支持指纹识别功能,在iOS 8以后支持指纹识别,今天随意试了试指纹识别功能的识别,写了一个小demo 1.环境 引入头文件 #import <LocalAuthentication/LocalAuthentication.h> 2.创建两个页面 第一个页面添加一个button,用来触发指纹识别的功能 第二个页面就加个label// // ViewController.m // FingerPrint // // Created by Silence on 16/1/2