Android M指纹的资料太少,经过一段时间阅读原生Android代码,写了以下例子,贡献出来给需要帮助的人。

  以下内容基于64位的高通CPU,搭载fpc1020芯片,此部分代码在原生android上做了更改,以应付工厂指纹的测试。原生android指纹录入需要采集10次(因不同的芯片而定)。

  代码简单说明:

  1. FingerPrintEnrollBase类:

  重要的是

Java代码
  1. public interface Listener {  
  2.         void onEnrollmentHelp(CharSequence helpString);  
  3.         void onEnrollmentError(int errMsgId, CharSequence errString);  
  4.         void onEnrollmentProgressChange(int steps, int remaining);  

  这个接口。

  1)onEnrollmentHelp函数:是下层返回的指纹操作帮助信息。

  2)onEnrollmentError函数是下层返回的错误信息,errMsgId是错误信息类型,其中1表示指纹硬件不可用,3表示超时,5表示操作已取消。errString是errMsgId对应的文字信息,有需要的自己实验就知道了。

  3)onEnrollmentProgressChange()函数是显示当前指纹的采集情况,steps:总共需要录入多少次;remaining是剩余多少次,我在此函数中有打印Log。

  2. FingerPrintActivity是主Activity类,FingerPrintEnrollBase是指纹Base类。

  需要特别说明的是,在FingerPrintEnrollBase类中有一句:private byte[] mToken = new byte[69];这个数组正常情况是通过输入密码后经由framework层向hal层申请的,我这里为了省去验证那一块的代码,通过sizeof(hw_auth_token_t)计算出来的为69,需要的请依此计算。我在代码里实验过,此数组如果不是69(在64位CPU上),将直接导致程序crach!

       fpc指纹的采集流程图:

Android6.0指纹识别开发实例

       源码如下:

       FingerPrintEnrollBase:

Java代码
  1. /* 
  2.  * Copyright (C) 2015 The Android Open Source Project 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  * 
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License 
  15.  */  
  16.   
  17. package com.mediatek.test;  
  18.   
  19. import android.app.Activity;  
  20. import android.app.Fragment;  
  21. import android.content.Context;  
  22. import android.hardware.fingerprint.FingerprintManager;  
  23. import android.os.Bundle;  
  24. import android.os.CancellationSignal;  
  25. import android.os.Handler;  
  26. import android.util.Log;  
  27. /** 
  28.  * local fragment to handle the state around fingerprint enrollment. 
  29.  */  
  30. public class FingerPrintEnrollBase extends Fragment {  
  31.   
  32.     private int mEnrollmentSteps = -1;  
  33.     private int mEnrollmentRemaining = 0;  
  34.     private Listener mListener;  
  35.     private boolean mEnrolling;  
  36.     private CancellationSignal mEnrollmentCancel;  
  37.     private Handler mHandler = new Handler();  
  38.     private byte[] mToken = new byte[69];//if byte length != sizeof(hw_auth_token_t), throws Exception  
  39.     private boolean mDone;  
  40.     private static final String TAG = "FingerPrintEnrollBase";  
  41.   
  42.     @Override  
  43.     public void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         setRetainInstance(true);  
  46.     }  
  47.   
  48.     @Override  
  49.     public void onAttach(Activity activity) {  
  50.         super.onAttach(activity);  
  51.     }  
  52.   
  53.     @Override  
  54.     public void onStart() {  
  55.         super.onStart();  
  56.         Log.d(TAG, "mToken length="+mToken.length);  
  57.         if (!mEnrolling) {  
  58.             FingerprintManager mFpM = (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);  
  59.             startEnrollment(mFpM);  
  60.         }  
  61.     }  
  62.   
  63.     @Override  
  64.     public void onStop() {  
  65.         super.onStop();  
  66.         if (!getActivity().isChangingConfigurations()) {  
  67.             cancelEnrollment();  
  68.         }  
  69.     }  
  70.   
  71.     protected void startEnrollment(FingerprintManager mFpM) {  
  72.         mHandler.removeCallbacks(mTimeoutRunnable);  
  73.         mEnrollmentSteps = -1;  
  74.         mEnrollmentCancel = new CancellationSignal();  
  75.         if(mFpM != null){  
  76.             mFpM.enroll(mToken, mEnrollmentCancel, 0, mEnrollmentCallback);  
  77.         }  
  78.         mEnrolling = true;  
  79.     }  
  80.   
  81.     protected void cancelEnrollment() {  
  82.         mHandler.removeCallbacks(mTimeoutRunnable);  
  83.         if (mEnrolling) {  
  84.             mEnrollmentCancel.cancel();  
  85.             mEnrolling = false;  
  86.             mEnrollmentSteps = -1;  
  87.         }  
  88.     }  
  89.   
  90.     public void setListener(Listener listener) {  
  91.         mListener = listener;  
  92.     }  
  93.   
  94.     public int getEnrollmentSteps() {  
  95.         return mEnrollmentSteps;  
  96.     }  
  97.   
  98.     public int getEnrollmentRemaining() {  
  99.         return mEnrollmentRemaining;  
  100.     }  
  101.   
  102.     public boolean isDone() {  
  103.         return mDone;  
  104.     }  
  105.   
  106.     private FingerprintManager.EnrollmentCallback mEnrollmentCallback  
  107.             = new FingerprintManager.EnrollmentCallback() {  
  108.   
  109.         @Override  
  110.         public void onEnrollmentProgress(int remaining) {  
  111.             if (mEnrollmentSteps == -1) {  
  112.                 mEnrollmentSteps = remaining;  
  113.             }  
  114.             mEnrollmentRemaining = remaining;  
  115.             mDone = remaining == 0;  
  116.             if (mListener != null) {  
  117.                 mListener.onEnrollmentProgressChange(mEnrollmentSteps, remaining);  
  118.             }  
  119.         }  
  120.   
  121.         @Override  
  122.         public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {  
  123.             if (mListener != null) {  
  124.                 mListener.onEnrollmentHelp(helpString);  
  125.             }  
  126.         }  
  127.   
  128.         @Override  
  129.         public void onEnrollmentError(int errMsgId, CharSequence errString) {  
  130.             if (mListener != null) {  
  131.                 mListener.onEnrollmentError(errMsgId, errString);  
  132.             }  
  133.         }  
  134.     };  
  135.   
  136.     private final Runnable mTimeoutRunnable = new Runnable() {  
  137.         @Override  
  138.         public void run() {  
  139.             cancelEnrollment();  
  140.         }  
  141.     };  
  142.   
  143.     public interface Listener {  
  144.         void onEnrollmentHelp(CharSequence helpString);  
  145.         void onEnrollmentError(int errMsgId, CharSequence errString);  
  146.         void onEnrollmentProgressChange(int steps, int remaining);  
  147.     }  
  148. }  

       FingerPrintActivity:

Java代码
  1. package com.mediatek.test;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6. import java.util.Timer;  
  7. import java.util.TimerTask;  
  8.   
  9. import android.R.color;  
  10. import android.app.Activity;  
  11. import android.app.AlertDialog;  
  12. import android.content.Context;  
  13. import android.content.DialogInterface;  
  14. import android.content.Intent;  
  15. import android.graphics.Color;  
  16. import android.os.Bundle;  
  17. import android.os.CancellationSignal;  
  18. import android.os.Handler;  
  19. import android.os.Message;  
  20. import android.text.Spannable;  
  21. import android.text.style.ForegroundColorSpan;  
  22. import android.util.Log;  
  23. import android.view.KeyEvent;  
  24. import android.view.View;  
  25. import android.view.View.OnClickListener;  
  26. import android.widget.Button;  
  27. import android.widget.ImageView;  
  28. import android.widget.ProgressBar;  
  29. import android.widget.TableRow;  
  30. import android.widget.TextView;  
  31. import android.widget.Toast;  
  32.   
  33. import com.mediatek.test.R;  
  34. import android.hardware.fingerprint.Fingerprint;  
  35. import android.hardware.fingerprint.FingerprintManager;  
  36.   
  37. public class FingerPrintActivity extends Activity implements FingerPrintEnrollBase.Listener{  
  38.     private static final String TAG = "FingerPrintActivity";  
  39.     private MyHandler mHandler = new MyHandler();  
  40.     private TextView fingerPrintAcquisitionTextView, fingerPrintEnrollmentErrorView, fingerPrintEnrollmentHelpView;  
  41.     private FingerPrintEnrollBase fpeb;  
  42.     private FingerprintManager mFingerprintManager;  
  43.       
  44.     @Override  
  45.     protected int setTitleId() {  
  46.         return R.string.tittle_fingerprint;  
  47.     }  
  48.   
  49.     @Override  
  50.     protected Activity getActivity() {  
  51.         return this;  
  52.     }  
  53.       
  54.     @Override  
  55.     protected void onCreate(Bundle savedInstanceState) {  
  56.         super.onCreate(savedInstanceState);  
  57.         setContentView(R.layout.fingerprint);  
  58.         fingerPrintAcquisitionTextView = (TextView)findViewById(R.id.fingerprint_message);  
  59.         fingerPrintEnrollmentErrorView= (TextView)findViewById(R.id.fingerprint_enrollment_error);  
  60.         fingerPrintEnrollmentHelpView= (TextView)findViewById(R.id.fingerprint_enrollment_help);  
  61.   
  62.         mFingerprintManager = (FingerprintManager) getActivity().getSystemService(  
  63.                 Context.FINGERPRINT_SERVICE);  
  64.           
  65.               
  66.     }  
  67.       
  68.     private void sendMsgToHandler(int msgType, String remark){  
  69.         Message msg = Message.obtain();  
  70.         msg.what = msgType;  
  71.         Bundle bundle = new Bundle();  
  72.         bundle.putString("result", remark);  
  73.         msg.setData(bundle);  
  74.         mHandler.sendMessage(msg);  
  75.     }  
  76.       
  77.     @Override  
  78.     public void onEnrollmentHelp(CharSequence helpString) {  
  79.         Log.d(TAG, "==onEnrollmentHelp="+helpString.toString());  
  80.         sendMsgToHandler(3, helpString.toString());  
  81.     }  
  82.   
  83.     @Override  
  84.     public void onEnrollmentError(int errMsgId, CharSequence errString) {  
  85.         Log.d(TAG, "==onEnrollmentError errMsgId="+errMsgId+" errString="+errString.toString());  
  86.         if(errMsgId == 3){//time out  
  87.             postEnrollment();  
  88.         }else if(errMsgId == 1){//hardware lose efficacy  
  89.             startEnrollment();  
  90.         }else if(errMsgId == 5){//operation cancel  
  91.         }else{  
  92.             sendMsgToHandler(4, errString.toString());  
  93.         }  
  94.     }  
  95.   
  96.     @Override  
  97.     public void onEnrollmentProgressChange(int steps, int remaining) {  
  98.         Log.d(TAG, "===============onEnrollmentProgressChange=======");  
  99.         Log.d(TAG, "steps" + steps + "||remaining=" + remaining);  
  100.         fingerPrintEnrollmentHelpView.setText("");  
  101.         fingerPrintEnrollmentErrorView.setText("");  
  102.         sendMsgToHandler(2, getString(R.string.fingerprint_validate_success));  
  103.         buttonS.setEnabled(true);  
  104.         stopFingerprint();  
  105.     }  
  106.       
  107.     private void startEnrollment(){  
  108.         if (fpeb == null) {  
  109.             fpeb = new FingerPrintEnrollBase();  
  110.         }  
  111.         fpeb.setListener(this);  
  112.         fpeb.startEnrollment(mFingerprintManager);  
  113.     }  
  114.     private void postEnrollment(){  
  115.         if(mFingerprintManager != null){  
  116.             mFingerprintManager.postEnroll();  
  117.         }  
  118.     }  
  119.       
  120.     private void stopFingerprint() {  
  121.         if (fpeb != null){  
  122.             fpeb.cancelEnrollment();  
  123.             onStop();  
  124.         }  
  125.     }  
  126.       
  127.     @Override  
  128.     protected void onStart() {  
  129.         super.onStart();  
  130.     }  
  131.       
  132.     @Override  
  133.     protected void onStop() {  
  134.         super.onStop();  
  135.         if(fpeb != null){  
  136.             fpeb.setListener(null);  
  137.         }  
  138.     }  
  139.   
  140.     @Override  
  141.     protected void onResume() {  
  142.         super.onResume();  
  143.         if(mFingerprintManager == null){  
  144.             mFingerprintManager = (FingerprintManager) getActivity().getSystemService(  
  145.                 Context.FINGERPRINT_SERVICE);  
  146.         }  
  147.           
  148.         startEnrollment();  
  149.     }  
  150.       
  151.     @Override  
  152.     protected void onPause() {  
  153.         super.onPause();  
  154.         postEnrollment();  
  155.         mFingerprintManager = null;  
  156.         stopFingerprint();  
  157.         fpeb = null;  
  158.     }  
  159.   
  160.       
  161.     class MyHandler extends Handler{  
  162.   
  163.         @Override  
  164.         public void handleMessage(Message msg) {  
  165.             Bundle bundle = null;  
  166.             super.handleMessage(msg);  
  167.             switch (msg.what) {  
  168.             case 0:  
  169.                 removeMessages(0);  
  170.                 bundle = msg.getData();  
  171.                 String result = bundle.getString("result");  
  172.                 selfTestView.setText(result);  
  173.                 selfTestView.setTextColor(result.contains("PASS")?Color.GREEN:Color.RED);  
  174.                 break;  
  175.             case 1:  
  176.                 removeMessages(1);  
  177.                 bundle = msg.getData();  
  178.                 String rs = bundle.getString("result");  
  179.                 checkBroadView.setText(bundle.getString("result"));  
  180.                 checkBroadView.setTextColor(rs.contains("PASS")?Color.GREEN:Color.RED);  
  181.                 break;  
  182.             case 2:  
  183.                 removeMessages(2);  
  184.                 bundle = msg.getData();  
  185.                 String fingerprint = bundle.getString("result");  
  186.                 fingerPrintAcquisitionTextView.setText(bundle.getString("result"));  
  187.                 fingerPrintAcquisitionTextView.setTextColor(fingerprint.contains("PASS")?Color.GREEN:Color.WHITE);  
  188.                 mButtonSelftest.setEnabled(true);  
  189.                 mButtonCheckerboardTest.setEnabled(true);  
  190.                 break;  
  191.             case 3:  
  192.                 removeMessages(3);  
  193.                 bundle = msg.getData();  
  194.                 String enrollmentHelp = bundle.getString("result");  
  195.                 fingerPrintEnrollmentHelpView.setText(bundle.getString("result"));  
  196.                 break;  
  197.             case 4:  
  198.                 removeMessages(4);  
  199.                 bundle = msg.getData();  
  200.                 String enrollmentError = bundle.getString("result");  
  201.                 fingerPrintEnrollmentErrorView.setText(bundle.getString("result"));  
  202.                 fingerPrintAcquisitionTextView.setText("");  
  203.                 break;  
  204.             default:  
  205.                 break;  
  206.             }  
  207.         }  
  208.     }  
  209.   
本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/585.html
2016年6月15日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:2