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

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

    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"

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

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

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

    自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.gree ...

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

    因为一个Winform的项目中需要用到带有合计行的表格,并且需要满足以下需求: 合计行可自动对需要求和的列进行求和计算; 合计行必须固定(冻结)在表格的最底部,且其位置不受滚动条的滚动而移动; 可以设 ...

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

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  4. [转载]TexturePacker 如何使用自带的加密功能及在cocos2dx中的使用

    在cocos2dx中使用纹理图集是非常节省资源的,在这里推荐 TexturePacker,而且 TexturePacker工具的加密接口也非常的好用,下面就来介绍一下... TexturePacker ...

  5. 为SRS流媒体服务器添加HLS加密功能(附源码)

    为SRS流媒体服务器添加HLS加密功能(附源码) 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的叫做 ...

  6. 痞子衡嵌入式:开启NXP-MCUBootUtility工具的HAB加密功能 - CST(中英双语)

    1 Reason for enabling HAB encryption function 为什么要开启HAB加密功能 NXP-MCUBootUtility is a tool designed fo ...

  7. 给 Qt sqlite 增加加密功能

    整合sqlite代码 开源的sqlite中没有实现加密的功能,所以如果需要加密功能,需要自己实现 sqlite3_keysqlite3_rekey 等相关函数 不过开源的 wxsqlite3中已经实现 ...

  8. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  9. SQLSERVER的一个不显眼的功能 备份文件的分割

    SQLSERVER的一个不显眼的功能 备份文件的分割 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了 但是如果要完整备份业务库需要12G的空 ...

随机推荐

  1. HDU 3420 -- Bus Fair ACM

    Bus Fair Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. Jenkins在deploy maven artifact时报Peer not authenticated.

    这是一起由Nexus证书导入错误造成的Jenkins运行异常. 最近,同事修改了Nexus服务器的host name,结果导致Jenkins里的任务全都执行不了了.虽然job的配置都已经更新指向新的N ...

  3. SAP S/4HANA生产订单的BAdI增强点之Initialize方法

    在S/4HANA里创建生产订单时,有一个增强点WORKORDER_UPDATE: 这个CAUFVDB里存放的是生产订单抬头级别的数据: 我们来观察下运行时这个结构里存放的数据. 请大家用我github ...

  4. char *转string遇到诡异的问题记录

    这个问题的背景是在用libevent的buffer_remove时出现的,写一个伪代码 char buffer[2048] ={0}; string str; int n = buffer_remov ...

  5. 如何理解“Unix 里一切都是文件”这句话-在 UNIX 中,一切都是字节流

    UNIX 操作系统的设计.用户界面.文化和演变都是建立在它的一套统一的想法和概念上.其中最重要的一点可能是“一切皆文件”,而这个概念被认为是 UNIX 的灵魂之一. 这一关键设计原则提供了一个统一的范 ...

  6. BZOJ 2818 GCD 【欧拉函数 || 莫比乌斯反演】

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2818 2818: Gcd Time Limit: 10 Sec  Memory Limit ...

  7. 备份&添加无线网络配置

    netsh wlan export profile key=clear folder=c:\ #备份 (ls c:\*.xml).FullName|%{netsh wlan add profile f ...

  8. tomcat部署web项目方法

    一.tomcat部署web项目之静态配置: 方法一:直接将为web项目放到webapps下: 如图所示:在webapps文件下,存放了一个html文件,启动tomcat,访问http://localh ...

  9. ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系

    ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY 是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景. ...

  10. Anaconda常用命令

    conda版本: conda --version 环境信息: 激活环境后,conda info 查看环境已安装包: conda list 新建环境: conda create -n {NAME} [ ...