Android 6.0指纹识别App开发Demo

现在很多手机都有指纹识别的功能,这边就简单了解学习一下。
贴一张效果图:

首先声明指纹识别权限:

这个权限是一个normal级别的,所以不需要再运行时加判断。
这里复习一下normal 权限有哪些:

    ACCESS_LOCATION_EXTRA_COMMANDS    ACCESS_NETWORK_STATE    ACCESS_NOTIFICATION_POLICY    ACCESS_WIFI_STATE    BLUETOOTH    BLUETOOTH_ADMIN    BROADCAST_STICKY    CHANGE_NETWORK_STATE    CHANGE_WIFI_MULTICAST_STATE    CHANGE_WIFI_STATE    DISABLE_KEYGUARD    EXPAND_STATUS_BAR    GET_PACKAGE_SIZE    INSTALL_SHORTCUT    INTERNET    KILL_BACKGROUND_PROCESSES    MODIFY_AUDIO_SETTINGS    NFC    READ_SYNC_SETTINGS    READ_SYNC_STATS    RECEIVE_BOOT_COMPLETED    REORDER_TASKS    REQUEST_INSTALL_PACKAGES    SET_ALARM    SET_TIME_ZONE    SET_WALLPAPER    SET_WALLPAPER_HINTS    TRANSMIT_IR    UNINSTALL_SHORTCUT    USE_FINGERPRINT    VIBRATE    WAKE_LOCK    WRITE_SYNC_SETTINGS

运行时需要判断的权限:

  group:android.permission-group.CONTACTS  permission:android.permission.WRITE_CONTACTS  permission:android.permission.GET_ACCOUNTS  permission:android.permission.READ_CONTACTS  group:android.permission-group.PHONE  permission:android.permission.READ_CALL_LOG  permission:android.permission.READ_PHONE_STATE  permission:android.permission.CALL_PHONE  permission:android.permission.WRITE_CALL_LOG  permission:android.permission.USE_SIP  permission:android.permission.PROCESS_OUTGOING_CALLS  permission:com.android.voicemail.permission.ADD_VOICEMAIL  group:android.permission-group.CALENDAR  permission:android.permission.READ_CALENDAR  permission:android.permission.WRITE_CALENDAR  group:android.permission-group.CAMERA  permission:android.permission.CAMERA  group:android.permission-group.SENSORS  permission:android.permission.BODY_SENSORS  group:android.permission-group.LOCATION  permission:android.permission.ACCESS_FINE_LOCATION  permission:android.permission.ACCESS_COARSE_LOCATION  group:android.permission-group.STORAGE  permission:android.permission.READ_EXTERNAL_STORAGE  permission:android.permission.WRITE_EXTERNAL_STORAGE  group:android.permission-group.MICROPHONE  permission:android.permission.RECORD_AUDIO  group:android.permission-group.SMS  permission:android.permission.READ_SMS  permission:android.permission.RECEIVE_WAP_PUSH  permission:android.permission.RECEIVE_MMS  permission:android.permission.RECEIVE_SMS  permission:android.permission.SEND_SMS  permission:android.permission.READ_CELL_BROADCASTS

具体的可以参考hongyang的这篇博客:http://blog.csdn.net/lmj623565791/article/details/50709663
好了言归正传
申明权限之后,我们需要在代码里判断下面几种情况:

设备条件判断

  • 1.设备是否支持指纹识别
  • 2.设备是否处于安全保护中(有指纹识别的手机,在使用指纹识别的时候,还需要强制设置密码或者图案解锁,如果未设置的话是不许使用指纹识别的)
  • 3.设备是否已经注册过指纹(如果用户未使用过这个指纹技术,那么只能提示用户到系统设置里面去设置)

指纹识别API调用

接下来就是调用指纹识别的API了,因为指纹识别是6.0系统才有的(当然不排除有些厂商定制系统的时候加入这些API,这里暂不考虑)。
有两种方式:

//这种使用的是v4的兼容包,推荐使用这种FingerprintManagerCompat managerCompat = FingerprintManagerCompat.from(this);//这种是使用系统服务,但是必须要在sdk为23以上版本才行FingerprintManager fingerprintManager = (FingerprintManager)getSystemService(Context.FINGERPRINT_SERVICE);

这里推荐使用第一种,这样才能向下兼容。
就像运行时权限为了保持兼容性建议使用v4包的兼容方法:

ContextCompat.checkSelfPermission()
ActivityCompat.requestPermissions()
ActivityCompat.OnRequestPermissionsResultCallback
ActivityCompat.shouldShowRequestPermissionRationale()
学习地址:http://blog.csdn.net/kong_gu_you_lan/article/details/52488097

另外,这里推荐一下谷歌中国的android的开发者官网:https://developer.android.google.cn/,开发者已经可以自由的在上面查阅资料了。
调用 managerCompat.authenticate方式实现指纹识别,这个方法有5个参数,其中第三个是CancellationSignal,调用cancel 可以取消指纹识别。第四个为AuthenticationCallback,是识别之后的各种回调。这里简单记录一下代码:
工具类:FingerprintUtil.java

package com.leafact.fingerprintdemo;import android.app.KeyguardManager;import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;import android.support.v4.os.CancellationSignal;/** * Created by leafact on 2016/12/21. */public class FingerprintUtil {    public static CancellationSignal cancellationSignal;    public static  void callFingerPrint(final OnCallBackListenr listener){        FingerprintManagerCompat managerCompat = FingerprintManagerCompat.from(MyApplication.context);        if (!managerCompat.isHardwareDetected()){ //判断设备是否支持            if (listener != null)                listener.onSupportFailed();            return;        }        KeyguardManager keyguardManager =(KeyguardManager)MyApplication.context.getSystemService(MyApplication.context.KEYGUARD_SERVICE);        if (!keyguardManager.isKeyguardSecure()) {//判断设备是否处于安全保护中            if (listener != null)            listener.onInsecurity();            return;        }        if (!managerCompat.hasEnrolledFingerprints()){ //判断设备是否已经注册过指纹            if (listener != null)                listener.onEnrollFailed(); //未注册            return;        }        if (listener != null)            listener.onAuthenticationStart(); //开始指纹识别        cancellationSignal  = new CancellationSignal(); //必须重新实例化,否则cancel 过一次就不能再使用了        managerCompat.authenticate(null,0,cancellationSignal,new FingerprintManagerCompat.AuthenticationCallback(){             // 当出现错误的时候回调此函数,比如多次尝试都失败了的时候,errString是错误信息,比如华为的提示就是:尝试次数过多,请稍后再试。             @Override             public void onAuthenticationError(int errMsgId, CharSequence errString) {                 if (listener != null)                     listener.onAuthenticationError(errMsgId ,errString );             }             // 当指纹验证失败的时候会回调此函数,失败之后允许多次尝试,失败次数过多会停止响应一段时间然后再停止sensor的工作             @Override             public void onAuthenticationFailed() {                 if (listener != null)                     listener.onAuthenticationFailed();             }             @Override             public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {                 if (listener != null)                     listener.onAuthenticationHelp(helpMsgId,helpString);             }             // 当验证的指纹成功时会回调此函数,然后不再监听指纹sensor             @Override             public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {                 if (listener != null)                     listener.onAuthenticationSucceeded(result);             }         ;        },null);    }    interface  OnCallBackListenr{        void onSupportFailed();        void onInsecurity();        void onEnrollFailed();        void onAuthenticationStart();        void onAuthenticationError(int errMsgId, CharSequence errString);        void onAuthenticationFailed();        void onAuthenticationHelp(int helpMsgId, CharSequence helpString);        void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result);    }    public static  void cancel(){        if (cancellationSignal != null)            cancellationSignal.cancel();    }}

这里写一个 OnCallBackListenr 进行回调封装起来。
调用类:MainActivity.java

package com.leafact.fingerprintdemo;import android.content.Context;import android.content.DialogInterface;import android.os.Handler;import android.os.Message;import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private Context mContext;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mContext = this;    }    public void onFingerprintClick(View v){        FingerprintUtil.callFingerPrint(new FingerprintUtil.OnCallBackListenr() {            AlertDialog dialog;            @Override            public void onSupportFailed() {                showToast("当前设备不支持指纹");            }            @Override            public void onInsecurity() {                showToast("当前设备未处于安全保护中");            }            @Override            public void onEnrollFailed() {                showToast("请到设置中设置指纹");            }            @Override            public void onAuthenticationStart() {                AlertDialog.Builder builder = new AlertDialog.Builder(mContext);                View view = LayoutInflater.from(mContext).inflate(R.layout.layout_fingerprint,null);                initView(view);                builder.setView(view);                builder.setCancelable(false);                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        handler.removeMessages(0);                        FingerprintUtil.cancel();                    }                });                dialog = builder.create();                dialog.show();            }            @Override            public void onAuthenticationError(int errMsgId, CharSequence errString) {                showToast(errString.toString());                if (dialog != null  &&dialog.isShowing()){                    dialog.dismiss();                    handler.removeMessages(0);                }            }            @Override            public void onAuthenticationFailed() {                showToast("解锁失败");            }            @Override            public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {                showToast(helpString.toString());            }            @Override            public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {                showToast("解锁成功");                if (dialog != null  &&dialog.isShowing()){                    dialog.dismiss();                    handler.removeMessages(0);                }            }        });    }    private Handler handler= new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.what == 0){                int i = postion % 5;                if (i == 0){                    tv[4].setBackground(null);                    tv[i].setBackgroundColor(getResources().getColor(R.color.colorAccent));                }                else{                     tv[i].setBackgroundColor(getResources().getColor(R.color.colorAccent));                     tv[i-1].setBackground(null);                }                postion++;                handler.sendEmptyMessageDelayed(0,100);            }        }    };    TextView[] tv = new TextView[5];    private int postion = 0;    private void initView(View view) {        postion = 0;        tv[0] = (TextView) view.findViewById(R.id.tv_1);        tv[1] = (TextView) view.findViewById(R.id.tv_2);        tv[2] = (TextView) view.findViewById(R.id.tv_3);        tv[3] = (TextView) view.findViewById(R.id.tv_4);        tv[4] = (TextView) view.findViewById(R.id.tv_5);        handler.sendEmptyMessageDelayed(0,100);    }    public void showToast(String name ){        Toast.makeText(MainActivity.this,name,Toast.LENGTH_SHORT).show();    }}

这里我加入了一个很简单的动画。
剩下的代码就不贴了,需要的话可以下载源码
源码地址 :http://download.csdn.net/detail/leafact/9717825

想深入的了解的同学可以参考这篇文章 http://blog.csdn.net/createchance/article/details/51991764

更多相关文章

  1. 【Android】广播大全 Intent Action 事件
  2. Android(安卓)输入系统分析
  3. android SDK的常用命令工具和资源
  4. Android指纹识别的简单用法
  5. Android(安卓)display架构分析(三)
  6. Android(安卓)wifi 连接设备的步骤
  7. 【Android】AppCompat V21:将 Materia Design 兼容到5.0之前的设
  8. Android平台上PMEM的使用及Platform设备注册(二)
  9. Android判断设备是否有NavigationBar(虚拟按键)并获取它的高度

随机推荐

  1. 【jar包】Android——eclipse共享library
  2. Android 自定义View canvas.drawRoundRec
  3. Android(安卓)Media Scanner Process
  4. android中使用多个CheckBox联动,CheckBox
  5. Java将Powermock和Mockito搭配进行单元测
  6. 把NDK集成到Eclipse
  7. 基于Android的Linux内核的电源管理:概述
  8. android 创建文件夹和文件
  9. Android(安卓)启用 SessionTicket
  10. Android(安卓)Studio系列-单元测试入门篇