欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android指纹解锁示例代码

程序员文章站 2024-02-23 20:48:46
android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘。 功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程...

android6.0及以上系统支持指纹识别解锁功能:项目中用到,特此抽离出来,备忘。

功能是这样的:在用户将app切换到后台运行(超过一定的时长,比方说30秒),再进入程序中的时候就会弹出指纹识别的界面。用户输入指纹,解锁成功。指纹识别的模块其实很简单啦,google的api已经封装好了,我们只需要学会调用就ok了。

思路:

在用户将程序切换到后台的时候需要有一个方法计时,这样的方法写在哪里呢,对,要写在service中。在activity中开启服务:

intent intent = new intent("com.example.fingureprint.services.judgefingureservice");
    intent.setpackage(getpackagename());
    startservice(intent);

intent.setpackage(getpackagename);在6.0及以上系统中启动服务必须加上这句。

服务不要忘记在清单文件中注册幺。

 <!--注册判断指纹密码开启的服务-->
    <service 
      android:name="com.example.fingureprint.services.judgefingureservice"
      android:enabled="true">
      <intent-filter >
        <action android:name="com.example.fingureprint.services.judgefingureservice"/>
      </intent-filter>
    </service>

在服务中onstart()开启一个线程:

new thread(){
      public void run() {
        try {
          while(true){
          thread.sleep(1000);
          if(isapponforeground()){
            log.i("前台运行", "time"+countnumber);
            if(countnumber>30){
              if(!"com.example.fingureprint.fingureariseactivity".equals(listactivity())){
                intent myintent = new intent();
                myintent.setflags(intent.flag_activity_new_task);
                myintent.setclass(getapplicationcontext(),fingureariseactivity.class);
                startactivity(myintent);
              }
              countnumber = 0;
            }else{
              countnumber = 0;
            }
          }else{
            log.i("后台运行", "time"+countnumber);
            countnumber ++;
          }
          }
          
        } catch (interruptedexception e) {
          e.printstacktrace();
        }
      };
      
    }.start();

计时用了个while死循环,让thread睡一秒。哈哈,没有用handler是不是很简单。

判断程序是否在后台运行:

  /**
   * 判断程序在前台运行的方法
   * @return
   */
  public boolean isapponforeground() {
    activitymanager systemservice = (activitymanager) this.getsystemservice(context.activity_service);
    list<runningappprocessinfo> runningappprocesses = systemservice.getrunningappprocesses();
    if(runningappprocesses==null) return false;
    for(runningappprocessinfo processes: runningappprocesses){
      if(processes.processname.equals("com.example.fingureprint")&&processes.importance==runningappprocessinfo.importance_foreground){
        return true;
      }
    }
    return false;
  }

有一个小细节,当用户从后台切换到前台,但是用户没有解锁,又切换到后台,过三十秒后切换到前台,这时候不能再跳出手势解锁界面了吧。

解决:1.设置下手势界面的启动方式。2.检测程序的当前运行界面。

  /**
   * 判断当前运行在前台的activity
   */
  @suppresswarnings("deprecation")
  public string listactivity(){
    activitymanager systemservice = (activitymanager) this.getsystemservice(context.activity_service);
    list<runningtaskinfo> runningtasks = systemservice.getrunningtasks(1);
    runningtaskinfo runningtaskinfo = runningtasks.get(0);
    componentname component = runningtaskinfo.topactivity;
    string classname = component.getclassname();
    return classname;
  }

下面讲一下指纹识别的api:在6.0及以上的v4包下:

 需要在清单文件中添加权限:

<uses-permission android:name="android.permission.use_fingerprint"/>

用到的类有 fingerprintmanagercompat,此类中的api可以检测您的手机是否有指纹传感器,手机有没有录入过指纹。

authenticationcallback,可以继承此类,分别重写里面的方法,用来接收指纹识别的结果:

具体的可以下载下面的demo.

地址:demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。